簡體   English   中英

Intel x86 Assembly中的循環永遠持續

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

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