RET是子程序的返回指令。执行本指令时:sp增加一个内存单元,栈顶数据出栈赋值给ip寄存器。
call和ret都是转移指令,它们都修改IP,或同时修改CS和IP。(CS代码段寄存器与IP指令指针寄存器)。它们经常用来实现子程序的设计。ret指令用栈中的数据,修改IP的内容,从而实现近转移;retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移。
CALL和RET指令
模块化程序设计call与ret指令共同支持了汇编语言编程中的模块化设计。在对现实的实际问题中,往往比较复杂,对现实问题分析时,把他转化成相互联系,不同层次的子问题,是必须的解决方法。
而call与ret指令对这种分析方法提供了程序实现上的支持。利用call和ret指令,用简洁的方法,实现多个相互联系,功能独立的子程序来解决一个复杂的问题。
ret用栈的数据修改IP的内容,实现近转移。
ret执行步骤:
(1):(IP)=((SS)*16+SP)
(2):(SP)=(SP)+2
执行过程
ret指令用栈中的数据,修改IP的值,从而实现近转移。
CPU执行ret指令时,进行下面两步操作:
(IP)=((SS)*16+(SP))
(SP)=(SP)+2
另一种用法ret n(n为整数)
等效于
(IP)=((SS)*16+(SP))
(SP)=(SP)+2
(SP)=(SP)+n
例如ret 4
pop ip
add sp,4
返回调用处
例:
push eax
call msgcall标号是把eip压入堆栈,然后再跳到标号msg处[标记1]
继续代码....
msg:
push 0
push 0
push eax
push 0
call dword ptr[MessageBoxA]
ret这是取出EIP,返回到调用处,继续执行[标记1]
扩展资料:功能:
从堆栈中退出pc的高8位和低8位字节,把堆栈指针减2,从pc值处开始继续执行程序。不影响任何标志。
例子
主程序
MAIN:SETB P1.0(1)开始主程序,P1.0口置1(P1.0口输出为高,可以控制LED点亮)
LCALL DELAY(2)此时当前堆栈指针加2,调用(6)DELAY延时子程序
CLR P1.0(3)P1.0口清零(P1.0口输出为低,可以控制LED熄灭)
LCALL DELAY(4)此时当前堆栈指针加2,调用(6)DELAY延时子程序
LJMP MAIN(5)跳转到主程序,这样LED实现循环点亮
子程序
DELAY:MOV R7,#250(6)250--&gtR7
D1:MOV R6,#250(7)250---&gtR6
D2:DJNZ R6,D2(8)(R6-1),等于零执行下一条,不等于零,则跳转到D2
DJNZ R7,D1(9)(R7-1),等于零执行下一条,不等于零,则跳转到D1
RET(10)当前堆栈指针减2,返回到(3)CLR P1.0继续执行MAIN主程序。
END.(11)程序结束(伪指令)
参考资料:
百度百科——RET指令
百度百科——ret
RET指令是子程序的最后一条指令,即恢复断点,返回主程序。没有要求RET指令非要和哪一条指令要配对使用。
RET是子程序返回指令,放在子程序的结尾,当子程序执行完后,靠该指令返回主程序。