我有以下程序:
SECTION .text
main:
mov ebx, 10
mov ecx, 50
repeat:
inc ebx
loop repeat
mov eax, ebx
ret
Run Code Online (Sandbox Code Playgroud)
当该程序运行时,它按预期返回60.但是,如果你删除最后的ret语句,程序运行正常,但然后返回0.为什么?
当你离开"ret"时,计算机执行最后一次"move eax,ebx",然后执行计算机内存中接下来发生的任何事情.
我很惊讶你没有得到非法指令/访问; 这将是最常见的回应.在捣毁寄存器之后,垃圾指令就像回归一样.
它还有点不清楚你的意思是"返回60".你的意思是作为命令提示符的值?很明显,你的程序无法防范非法指令陷阱.当你在没有防御的情况下获得这样的陷阱时,Windows所做的事情对我来说并不清楚; 我从经验中知道,当我这样做时,Windows往往只是终止我的进程,我得到一些随机的退出状态."0"可能是这样的状态.
尝试添加:
mov byte ptr[eax], 0
Run Code Online (Sandbox Code Playgroud)
在"ret"指令之前; 这将导致非法的内存引用.您报告您获得的状态.如果你在这种情况下获得零状态结果,我不会感到惊讶.