我试图在NASM中编写一个简单的汇编程序,该程序将打印Hello World 5次。但是在无限循环打印问候世界中执行失败。我尝试调试代码,发现ecx
未正确执行,并且eax
显示其他值。我的代码如下:
section .data
msg: db "Hello World",10,0
section .text
global main
extern printf
main: push ebp
mov ebp,esp
mov ecx,0
mov DWORD[esp-4],0x5
mov eax,DWORD[esp-4]
jmp .loop
.loop:
push eax
push ecx
add esp,8
pop ecx
pop eax
cmp ecx,eax
jne .task
jmp .done
.task:
push DWORD msg
call printf
add esp,4
add ecx,1
jmp .loop
.done:
mov esp,ebp
pop ebp
ret
你能通过显示我的缺点来帮助我吗?
最佳答案
根据X86 calling conventions,寄存器EAX,ECX和EDX被调用者保存。在调用printf
之前先保存它们,然后再恢复。
您的代码中还有一个我听不懂的片段(add esp, 8
被循环中的push / pop包围)。在这里我无法提供任何解释,但是如果您也不理解,那可能是错误的。
关于c - 无法在NASM中执行循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14676521/