如果函数没有显式使用'ret',为什么没有返回值

sir*_*lot 2 x86 assembly

我有以下程序:

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.为什么?

Ira*_*ter 6

当你离开"ret"时,计算机执行最后一次"move eax,ebx",然后执行计算机内存中接下来发生的任何事情.

我很惊讶你没有得到非法指令/访问; 这将是最常见的回应.在捣毁寄存器之后,垃圾指令就像回归一样.

它还有点不清楚你的意思是"返回60".你的意思是作为命令提示符的值?很明显,你的程序无法防范非法指令陷阱.当你在没有防御的情况下获得这样的陷阱时,Windows所做的事情对我来说并不清楚; 我从经验中知道,当我这样做时,Windows往往只是终止我的进程,我得到一些随机的退出状态."0"可能是这样的状态.

尝试添加:

      mov   byte ptr[eax], 0
Run Code Online (Sandbox Code Playgroud)

在"ret"指令之前; 这将导致非法的内存引用.您报告您获得的状态.如果你在这种情况下获得零状态结果,我不会感到惊讶.