C 无法在NASM中执行循环
我试着用NASM编写一个简单的汇编程序,它可以打印Hello World 5次。但执行在无限循环中失败。我试着调试代码,发现C 无法在NASM中执行循环,c,assembly,x86,nasm,C,Assembly,X86,Nasm,我试着用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
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
您能帮我显示一下我的故障吗。根据,寄存器EAX、ECX和EDX都已保存。在调用printf
之前保存它们,然后恢复
您的代码中还有一个片段我无法理解(addesp,8
被push/pop包围,在一个循环中)。我不能在这里提供任何解释,但如果您也不理解,它可能是错误的。Anton(以上)是正确的-无法解释的add esp,8
将丢弃堆栈并将一切都搞糟(您应该假设printf
将丢弃您所依赖的ECX和EAX中的值)
以下是参考版本:
section .data
msg: db "Hello World",10,0
section .text
global main
extern printf
main:
push dword 0x5 ;count = 5;
.next:
push dword msg
call printf
add esp,4
sub dword [esp],1 ;count--;
jne .next ;if(count != 0) goto next;
add esp,4 ;Remove "count" from stack
mov eax,0 ;Value to return from "main"
ret
我不太了解ASM,但我认为您可以从和开始