我有以下程序:
SECTION .text
main:
mov ebx, 10
mov ecx, 50
repeat:
inc ebx
loop repeat
mov eax, ebx
ret
当该程序运行时,它按预期返回 60。然而,如果你放弃了最后的ret
语句,程序运行正常,但随后返回0。这是为什么呢?
当您省略“ret”时,计算机将执行最后一个“move eax, ebx”,然后执行计算机内存中的下一个内容。
我很惊讶你没有得到非法指令/访问;这将是最常见的反应。不知何故,垃圾指令的作用就像是在丢弃寄存器之后的返回。
它也有点不清楚你所说的“返回 60”是什么意思。您的意思是作为命令提示符的值?很明显,你的程序没有防御非法指令陷阱的能力。
我不清楚当你在没有防御的情况下遇到这样的陷阱时 Windows 会做什么;根据我的经验,当我这样做时,Windows 往往会终止我的进程,并且我会得到一些随机退出状态。 “0”可能就是这样的一种状态。
尝试添加:
mov byte ptr[eax], 0
在“ret”指令之前;这将导致非法内存引用。您报告您获得的状态。如果您在这种情况下得到零状态结果,我不会感到惊讶。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)