因为循环不算数

时间:2014-06-22 21:21:53

标签: assembly for-loop

我在Linux下使用NASM作为汇编程序和gcc作为链接器的x86程序集中的for循环存在问题。 这是我的代码:

    SECTION .data
    msg: dw "working",10, 0
    msglen: equ $-msg
    msgtwo: dw "not",10,0
    msgtwolen: equ $-msgtwo
SECTION .text
    global main

main:
    push ebp    ; making the stack
    mov ebp, esp    ; -|-
    mov ecx, 0x0    ; counter
    mov ebx, 0xA    ; value that should be reached
    cmp ecx, ebx    ; checkif i < 10
    jne notzero ; jump if i < 10
    je zero ; jump if i == 0
notzero:
    inc ecx         ; ecx++
    mov eax, 4
    mov ebx, 1
    mov ecx, msgtwo
    mov edx, msgtwolen
    int 80h
zero:
    mov eax, 4  ; write sys call
    mov ebx, 1  ; stdout
    mov ecx, msg    ; msg to print
    mov edx, msglen ; msg len
    int 80h     ; interrupt
    mov esp, ebp    ;destroing the stack
    pop ebp      ; -|-

我已对所有内容发表评论,因此您可以更轻松地弄清楚我要做的事情。这是问题所在。当程序完成时,它应打印&#34;工作&#34;,在计数时应该打印&#34;不是&#34;,它只打印一次&#34;不打印#34;而不打印9次。这是输出:

not
working

2 个答案:

答案 0 :(得分:0)

你永远不会跳回到循环头,这应该是cmp指令,但你也在ecx中破坏了计数器值,所以你也需要处理这个问题。

答案 1 :(得分:0)

为了有一个循环,你需要一个分支/跳回到底部的循环顶部,你没有(它就在zero之前)。

此外,您在jne之前不需要nonzero:如果je失败,它将会落到那里。