我一直在尝试编写一个打印数字的汇编过程。我编写了打印单个字符的程序printc
:
printc: push ebp
mov ebp, esp
mov eax, 4
mov ebx, 1
add [ebp + 8], byte '0'
lea ecx, [ebp + 8]
mov edx, 1
int 0x80
mov esp, ebp
pop ebp
ret
然后我试着写printi
,所以:
printi: push ebp
mov ebp, esp
mov eax, [ebp + 8]
cmp eax, 0
je end
mov ebx, 10
div ebx
push eax
call printi
push edx
call printc
end: mov esp, ebp
pop ebp
ret
最后,我调用了printi
:
_start: push 32
call printi
得到Segmentation fault (core dumped)
。知道为什么吗?
正如Peter Cordes正确地说的,如果程序没有因为printi
中的无限递归而提前崩溃,那么它将脱离_start
并返回到未定义的代码。
存在无限递归的原因:您可能认为div ebx
将EAX
除以10。它没有:它将EDX:EAX
64位值除以EBX
,并且您不控制EDX
。
在DIV
之前将EDX
清零可以让程序打印一些东西(但不是所需的输出(,然后当它从printi
掉下来时崩溃。