汇编ret指令怎么用?

 我来答
问明6E
高粉答主

2019-05-27 · 每个回答都超有意思的
知道答主
回答量:279
采纳率:100%
帮助的人:12.9万
展开全部

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 msg;call标号是把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-->R7

D1:MOV R6,#250;(7)250--->R6

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

意法半导体(中国)投资有限公司
2023-06-12 广告
STM32F103是一款高性能的嵌入式芯片,由意法半导体(STMicroelectronics)公司生产。它是STM32系列芯片之一,具有紧凑、低功耗、高性能等特点,被广泛应用于嵌入式系统中。STM32F103的主要特点包括:1. 集成了A... 点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
huanghaohongso
推荐于2017-05-27 · TA获得超过2万个赞
知道小有建树答主
回答量:968
采纳率:50%
帮助的人:353万
展开全部
不带任何参数时,用于在子程序的结束位置,被调用的子程序必须有ret指令,否则调用没有ret指令的子程序会导致自陷,子程序执行完之后处于失控状态。带参数ret n 表示子程序返回主程序的同时,堆栈弹出n个字节(栈顶指针减n)。。。阿门。。。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
AJISky
2011-07-02 · TA获得超过1122个赞
知道小有建树答主
回答量:457
采纳率:100%
帮助的人:245万
展开全部
ret 默认是返回一个地址,即 ret 4
当在程序进入前压入多个参数后就要弹出相应的地址个数
比如
push a
push b
push c
....
...
ret 12 (3*4一个地址占四个空间)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
amidz
2011-07-09 · TA获得超过1069个赞
知道小有建树答主
回答量:1525
采纳率:0%
帮助的人:868万
展开全部
做为子程序的最后一个语句
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式