Assembly Nasm中while循环的必要示例
有人能给我解释一下如何用NASAM汇编语言写一个While循环吗,例如哪些寄存器涉及到什么mov操作以及计数器是如何保持的,我正在尝试掌握汇编,但一开始有点棘手 谢谢各位Assembly Nasm中while循环的必要示例,assembly,nasm,Assembly,Nasm,有人能给我解释一下如何用NASAM汇编语言写一个While循环吗,例如哪些寄存器涉及到什么mov操作以及计数器是如何保持的,我正在尝试掌握汇编,但一开始有点棘手 谢谢各位 顺便说一句:我想学习这门语言是为了上一门课,我想你会问一下x86汇编程序吧? 在汇编程序中没有while循环(也许您可以在某个时候使用特殊的宏,具体取决于汇编程序)。你必须自己建造。您可以使用汇编程序命令,如 jne, jnz, je, jz, cmp, inc, dec 或者更特殊的命令 jcxz, loop 例如: m
顺便说一句:我想学习这门语言是为了上一门课,我想你会问一下x86汇编程序吧? 在汇编程序中没有while循环(也许您可以在某个时候使用特殊的宏,具体取决于汇编程序)。你必须自己建造。您可以使用汇编程序命令,如
jne, jnz, je, jz, cmp, inc, dec
或者更特殊的命令
jcxz, loop
例如:
mov ecx,255
L1:
dec ecx
jne L1
ret
本例对寄存器ecx中的值进行计数,直到0,然后离开循环。
这是另一个例子,但也算在上面
mov ecx,0
L2:
inc ecx
cmp ecx, 255
jne L2
ret
一个循环需要一个起始点(可能有一个方便的标签),中间有一些东西(循环体),还有一个跳转到开始的指令。跳转可能是基于某些条件终止循环的条件,或者循环体中可能存在通过跳转到其他地方来显式终止循环的内容。尽管某些指令集(如x86和x86-64)具有特定的指令,这些指令旨在简化循环写入,并且可能对某些寄存器具有某些硬编码依赖性,但对您使用的寄存器或内存位置或指令没有特别的限制。然而,同样,也没有要求实际使用这些
除此之外,你的问题还不够明确,没有更多需要补充的内容,只是强烈推荐你为之编写的CPU制造商(英特尔、AMD等)的程序员参考手册,这些手册通常是免费下载的。许多宏汇编程序确实支持WHILE宏: 以下是摩托罗拉在70年代编写的6809代码:
WHILE B,GT,(0,Y)
ORA B,X
DECB
ENDWH
(为了清楚起见,那里使用的唯一“实际”6809操作码是ORA和DECB。)NASM不是一种语言,它是一个程序,一个汇编程序。对。Nasm是一个汇编程序。。。它有自己的论坛——如果我在这里回答这个问题,他们就会关闭它。:)好吧,假设我想做一个假设的while循环,它取a#假设16并将其除以2,直到商为0,我需要在每次数字除以2时进行比较,我还假设“loop:”是一个标签而不是一个函数正确吗?在这种情况下,您应该简单地初始化一个寄存器(可能是eax)用这个数字除以2。在这种特殊情况下,可以使用向右移位一位(=等于整数除以2),如果eax中的数字已经为0,则可以离开循环。是的,你是对的,循环是一个标签。不要用
loop:
作为标签:它也是,所以你会从一些汇编器那里得到奇怪的语法错误。是的,使用“loop”作为标签不是一个好主意。我修正了答案。抱歉,NASM不支持这种事情。MASM确实有一些高级指令,比如IF
,可能还有循环,但这是NASM的问题。