如何用x86汇编语言编写循环?

use*_*288 16 x86 assembly loops

我编写的代码到目前为止:

.code

main
 Clrscr

  mov dh,10            ;row 10

  mov dl,20            ;column 20

  call Gotoxy          ;locate cursor

  PromptForIntegers  

    WriteString       ;display string
    ReadInt           ;input integer
  ArraySum

    WriteString       ;display string
    WriteInt          ;display integer

DisplaySum  ENDP

END main
Run Code Online (Sandbox Code Playgroud)

如何使用循环重复相同的步骤三次,在每次循环迭代后清除屏幕?

Art*_*ski 19

mov cx,3

loopstart:
   do stuff
   dec cx          ;Note:  decrementing cx and jumping on result is
   jnz loopstart   ;much faster on Intel (and possibly AMD as I haven't
                   ;tested in maybe 12 years) rather than using loop loopstart
Run Code Online (Sandbox Code Playgroud)

  • 你可以使用`loop loopstart`而不是`dec cx`和`jnz loopstart`只要`do stuff`保留cx寄存器 (5认同)
  • @PA:即使你不使用`loop`,也需要保留cx. (5认同)

Jef*_*f B 12

另一种方法是使用LOOP指令:

mov  cx, 3

myloop:
    ; Your loop content

    loop myloop
Run Code Online (Sandbox Code Playgroud)

循环指令自动递减cx,并且只有在cx!= 0时跳转.如果你想对你的循环进行一些额外的检查以提前爆发,还有LOOPE和LOOPNE变体.

如果要在循环期间修改cx,请确保在循环内容之前将其推入堆栈,并在以下情况后将其弹出:

mov  cx, 3

myloop:
    push cx
    ; Your loop content
    pop  cx

    loop myloop
Run Code Online (Sandbox Code Playgroud)


t0m*_*13b 4

使用CX寄存器来计算循环次数

莫夫克斯,3
启动循环:
   CMP CX, 0
   jz 循环结束
   推CX
疯狂:
   呼叫 ClrScr
   流行CX
   十月十日
   jmp 启动循环
循环结束:
   ; 循环结束
   ; 在这里做你必须做的事

这只是循环 3 次调用ClrScr,将 CX 寄存器压入堆栈,与 0 进行比较,如果设置了 ZeroFlag 则跳转,然后跳转到endofloop。请注意 CX 的内容如何入栈/出栈以维持循环流程。

  • 一些优化:(1)您可以使用“jcxz label”代替“cmp cx,0”和“jz label”。(2) 你可以使用“loop label”代替“dec cx”和“jnz label” (2认同)