[英]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.