Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly Nasm中while循环的必要示例_Assembly_Nasm - Fatal编程技术网

Assembly Nasm中while循环的必要示例

Assembly Nasm中while循环的必要示例,assembly,nasm,Assembly,Nasm,有人能给我解释一下如何用NASAM汇编语言写一个While循环吗,例如哪些寄存器涉及到什么mov操作以及计数器是如何保持的,我正在尝试掌握汇编,但一开始有点棘手 谢谢各位 顺便说一句:我想学习这门语言是为了上一门课,我想你会问一下x86汇编程序吧? 在汇编程序中没有while循环(也许您可以在某个时候使用特殊的宏,具体取决于汇编程序)。你必须自己建造。您可以使用汇编程序命令,如 jne, jnz, je, jz, cmp, inc, dec 或者更特殊的命令 jcxz, loop 例如: m

有人能给我解释一下如何用NASAM汇编语言写一个While循环吗,例如哪些寄存器涉及到什么mov操作以及计数器是如何保持的,我正在尝试掌握汇编,但一开始有点棘手

谢谢各位


顺便说一句:我想学习这门语言是为了上一门课,我想你会问一下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的问题。