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

时间:2010-02-05 18:27:55

标签: loops assembly x86

到目前为止,我编写了代码:

.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

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

6 个答案:

答案 0 :(得分: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

答案 1 :(得分:11)

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

mov  cx, 3

myloop:
    ; Your loop content

    loop myloop

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

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

mov  cx, 3

myloop:
    push cx
    ; Your loop content
    pop  cx

    loop myloop

答案 2 :(得分:2)

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

mov cx, 3
startloop:
   cmp cx, 0
   jz endofloop
   push cx
loopy:
   Call ClrScr
   pop cx
   dec cx
   jmp startloop
endofloop:
   ; Loop ended
   ; Do what ever you have to do here

这简单地循环3次调用ClrScr,将CX寄存器推入堆栈,比较为0,如果设置了ZeroFlag则跳转到endofloop。注意如何在堆栈中推/出CX的内容以保持循环的流动。

答案 3 :(得分:1)

.model small
.stack 100h
.code 
Main proc
Mov cx , 30 ; //that number control the loop 30 means the loop will 
;excite 30 time 
Ioopfront:
Mov ah , 1
Int 21h 
Loop loopfront; 

这个鳕鱼需要30个字符

答案 4 :(得分:0)

您需要使用条件jmp命令。这与您使用的语法不同;看起来像MASM,但是这里使用GAS是我写的一些代码来计算gcd的例子:

gcd_alg:
    subl    %ecx, %eax      /* a = a - c */
    cmpl    $0, %eax        /* if a == 0 */
    je      gcd_done        /* jump to end */
    cmpl    %ecx, %eax      /* if a < c */
    jl      gcd_preswap     /* swap and start over */
    jmp     gcd_alg         /* keep subtracting */

基本上,我将两个寄存器与cmpl指令进行比较(比较长)。如果它少于JL(跳转较少)指令跳转到预交换位置,否则它会跳回到相同的标签。

关于清除屏幕,这取决于您正在使用的系统。

答案 5 :(得分:0)

我正在寻找同样的答案&amp;发现此信息来自wiki有用: 循环说明

循环指令递减ECX并跳转到arg指定的地址,除非递减ECX导致其值变为零。例如:

 mov ecx, 5
 start_loop:
 ; the code here would be executed 5 times
 loop start_loop

循环没有设置任何标志。

loopx arg

如果满足条件(即设置了特定标志),这些循环指令会递减ECX并跳转到arg指定的地址,除非递减ECX导致其值变为零。

  • loope 循环,如果相等

  • loopne 循环如果不相等

  • loopnz 循环,如果不是零

  • loopz 循环,如果为零

来源:X86 Assembly, Control Flow