我在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
答案 0 :(得分:0)
你永远不会跳回到循环头,这应该是cmp
指令,但你也在ecx
中破坏了计数器值,所以你也需要处理这个问题。
答案 1 :(得分:0)
为了有一个循环,你需要一个分支/跳回到底部的循环顶部,你没有(它就在zero
之前)。
此外,您在jne
之前不需要nonzero
:如果je
失败,它将会落到那里。