Assembly 如果在没有呼叫的情况下使用ret会发生什么?

Assembly 如果在没有呼叫的情况下使用ret会发生什么?,assembly,avr,Assembly,Avr,我对汇编非常陌生,我想知道ret的行为。如果我在代码中从不使用调用,而是将ret放在末尾,那么代码就会回到开头。当没有使用调用时,这是默认行为吗?如果我使用了jmp,如果仍然没有使用调用,这会影响ret的行为吗?call将下一条指令的地址放入调用堆栈,然后跳转到目标地址 ret从调用堆栈中弹出最后一个地址,然后跳到这里。如果堆栈为空,则返回0x00000000,并跳到程序的开头。至少在某些系统中。由于地址空间冲突,不应使用此选项 jmp对调用堆栈没有影响,因此它不会修改ret的行为 编辑:正如@

我对汇编非常陌生,我想知道ret的行为。如果我在代码中从不使用调用,而是将ret放在末尾,那么代码就会回到开头。当没有使用调用时,这是默认行为吗?如果我使用了jmp,如果仍然没有使用调用,这会影响ret的行为吗?

call
将下一条指令的地址放入调用堆栈,然后跳转到目标地址

ret
从调用堆栈中弹出最后一个地址,然后跳到这里。如果堆栈为空,则返回
0x00000000
,并跳到程序的开头。至少在某些系统中。由于地址空间冲突,不应使用此选项

jmp
对调用堆栈没有影响,因此它不会修改
ret
的行为


编辑:正如@PeterCordes所写;如果您使用
push
pop
,它们可以写入堆栈内存,而
ret
会弹出堆栈内存。

在许多系统中,启动/启动代码实际上调用
main()
函数(或其等效函数),例如使用的裸机AVR程序(其优点是编译器可以编译
main()
作为一种功能(与任何其他功能一样,不需要任何特殊处理)

因此,当
main()
中的用户代码执行
ret
(即使用户代码本身从未实际调用过anthing),用户代码将从该隐式调用返回,启动/启动代码将继续运行


现在的问题是,在
main()
返回后,启动/启动代码会做什么。它可能会进入一个无休止的繁忙循环,停止系统、关机、重新启动等。

如果您在
ret
之前使用其他指令,如
push
,它会弹出您按下的任何指令<代码>调用并不是唯一可以写入堆栈内存的指令
ret
基本上只是指令指针的一个弹出窗口。如果您有兴趣查看当前处理器以外的内容,请先说一下:虽然AVR、x86和许多其他处理器返回到从堆栈获取的返回地址,但也有一些处理器返回到从特殊寄存器获取的返回地址。