汇编中ret的一个疑惑

来源:百度知道 编辑:UC知道 时间:2024/05/14 20:04:16
A:
CLT
RJMP B
BLD BitFlagR9, ADVal_Flag .
B:
CLT
BLD BitFlagR9, ADVal_Flag
RJMP C
E:
CLT
BLD BitFlagR9, ADVal_Flag
C:
CLT
BLD BitFlagR9, ADVal_Flag
ret

程序是随便写的,A调用b ,b末尾调用c ,c末尾ret,我只想知道c在 ret后执行哪条语句?为什么
在编译器里ret后执行的是a中rjmp b下面一条,可是我认为应该执行e的指令。

ret语句并不是像你想象的那样作为一个跳转语句的返回值使用的。
ret语句是和call语句配套出现的。就像c语言里面的两个大括号一样,有左边的,就要相应的有右边的。
当你调用call命令的时候,PC寄存器的内容被压栈,程序转去执行call指令指向的地址,也就是PC寄存器被赋于新值。
当你调用ret命令的时候,堆栈栈顶元素被返回到PC里面,然后pc++,从刚才的断点继续执行。
你的程序里面没有用call语句,所以没有压栈的过程,就直接用了ret,从堆栈里面弹出来的没准是什么东西。

你的编译器坏了。换个试试。嘿嘿。