簡體   English   中英

如何用x86匯編語言編寫循環?

[英]How to make a loop in x86 assembly language?

我編寫的代碼到目前為止:

.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

如何使用循環重復相同的步驟三次,在每次循環迭代后清除屏幕?

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

另一種方法是使用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

使用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,如果設置了endofloop則跳轉到endofloop 請注意如何在堆棧上/從堆棧中推送/彈出CX的內容以維持循環的流動。

.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個字符

我一直在尋找相同的答案,並從維基上找到這些信息: 循環說明

循環指令遞減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裝配,控制流程

您需要使用條件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(跳轉少)指令跳轉到預交換位置,否則它跳回到相同的標簽。

至於清除屏幕,這取決於您正在使用的系統。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM