[英]Loop in Intel x86 Assembly going on forever
我目前正在學習Intel x86 Assembly,嘗試構建一個簡單的循環(循環10次)時遇到問題。 它應該在10個循環后停止,但它會一直持續下去。
這是我正在使用的代碼:
section .data
msg db "Hello, World!", 0x0a
len equ $-msg
section .text
global _start
_start:
mov cx, 10 ; loop counter
_loop_start:
mov ebx, 0x01
mov ecx, msg
mov edx, len
mov eax, 0x04
int 0x80
dec cx
cmp cx, 0
jge _loop_start
_done:
mov ebx, 0x00
mov eax, 0x01
int 0x80
在嘗試編寫此代碼之前,我查看了本教程以進行簡單的算術。
我這樣編譯它:
nasm -f elf64 test.s -o test.o
並像這樣鏈接:
ld -s -o test_exec test.o
在此先感謝,Anickyan
cx是ecx的低16位部分。 您的代碼建議您可能認為循環將運行10次(在循環之前將cx設置為10)。 但是,然后用mov ecx, msg
用msg的地址覆蓋該值。 因此,您將從該數字的低16位開始倒數至0。 但是減量甚至沒有作用,因為在下一次迭代中,您再次用msg的地址覆蓋了ecx。 然后循環再次開始。 這是一個無限循環。 您是否在調試器中檢查了軟件? 這可以有很大幫助。
如果解決了“覆蓋”問題,並且如果我們從10的計數器開始減少每個電路的計數器,並且如果計數器的值大於或等於0則分支,那么我們將循環11次。
或者,我們也可以使用zeroflag進行分支(如果未設置zeroflag):
dec cl
jnz _loop_start
“ dec”指令已經包含了標志寄存器,因此,如果要檢查值是否減小到零,則不需要“ cmp”指令。
短劍
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.