x86 ASM Linux - 创建循环

nma*_*rko 5 string x86 assembly nasm

我正在开发一个程序 - 应该很简单 - 在使用NASM和x86 Intel汇编语法的Linux操作系统上.

我遇到的问题是我无法为我的程序创建一个工作循环:

section .data
    hello:    db 'Loop started.', 0Ah   ;string tells the user of start
    sLength:  equ $-hello               ;length of string

    notDone:  db 'Loop not finished.', 0Ah ;string to tell user of continue
    nDLength: equ $-notDone                ;length of string

    done:     db 'The loop has finished', 0Ah ;string tells user of end
    dLength:  equ $-done                      ;length of string

section .text

    global _start:
_start:
    jmp welcome         ;jump to label "welcome"

    mov ecx, 0          ;number used for loop index
    jmp loop            ;jump to label "loop"

    jmp theend          ;jump to the last label

welcome:

    mov eax, 4
    mov ebx, 1
    mov ecx, hello
    mov edx, sLength
    int 80              ;prints out the string in "hello"

loop:
    push ecx            ;put ecx on the stack so its value isn't lost

    mov eax, 4
    mov ebx, 1
    mov ecx, notDone
    mov edx, nDLength
    int 80              ;prints out that the loop isn't finished

    pop ecx             ;restore value
    add ecx, 1          ;add one to ecx's value
    cmp ecx, 10
    jl loop             ;if the value is not ten or more, repeat

theend:

;loop for printing out the "done" string
Run Code Online (Sandbox Code Playgroud)

我正在打印第一个字符串,一个"未完成",最后一个字符串打印出来; 我错过了九个"未完成"!有没有人知道为什么我会失去ecx寄存器的价值?

谢谢.

龚元程*_*龚元程 1

_start:
    jmp welcome
Run Code Online (Sandbox Code Playgroud)

这意味着 JMP 下面的所有代码都不会执行,尤其是 mov ecx,0 (对于较短的指令,应该是xor ecx,ecx )

不要从跳转开始,而是从一些代码开始。JMP是跳转,跳转后不会返回,只是继续执行。

因此,在跳转到Welcome:之后,您直接进入Loop:,从而错过了ecx=0代码。

cmp ecx, 10
jl loop
Run Code Online (Sandbox Code Playgroud)

ECX不为0,肯定大于10h,所以不循环。

尝试这个:

_start:
    mov eax, 4
    mov ebx, 1
    mov ecx, hello
    mov edx, sLength
    int 80              ;prints out the string in "hello"
    xor ecx,ecx         ;ecx = 0

loop:
    push ecx            ;save loop index
    mov eax, 4
    mov ebx, 1
    mov ecx, notDone
    mov edx, nDLength
    int 80              ;prints out that the loop isn't finished

    pop ecx             ;get loop index back in ECX
    add ecx, 1          ;add one to ecx's value
    cmp ecx, 10
    jl loop             ;if the value is not ten or more, repeat

theend:
Run Code Online (Sandbox Code Playgroud)