OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5531|回复: 10

汇编操作中压栈、出栈的小问题!!

[复制链接]

57

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2019-11-13
在线时间
40 小时
发表于 2020-4-23 23:35:55 | 显示全部楼层 |阅读模式
1金钱
这里是将 LR 寄存器压栈,最后出栈的为什么是 PC 呢?
Image [2].png

最佳答案

查看完整内容[请看2#楼]

可以看看这个链接,讲解的很好 https://blog.csdn.net/mao_hui_fei/article/details/83451648
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

890

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2390
金钱
2390
注册时间
2019-9-25
在线时间
397 小时
发表于 2020-4-23 23:35:56 | 显示全部楼层
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2020-4-25 10:42:10 | 显示全部楼层
将LR压进入,出的时候将这个LR赋给PC啊
回复

使用道具 举报

2

主题

712

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2178
金钱
2178
注册时间
2018-8-27
在线时间
258 小时
发表于 2020-4-25 13:04:53 | 显示全部楼层
push压栈的时候将LR寄存器中的数据存放到栈内存,pop出栈的时候将栈内存存放的数据放置到PC寄存器中,这个很难理解?
森罗万象
回复

使用道具 举报

57

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2019-11-13
在线时间
40 小时
 楼主| 发表于 2020-4-25 22:23:18 | 显示全部楼层
xiaotaotao 发表于 2020-4-25 13:04
push压栈的时候将LR寄存器中的数据存放到栈内存,pop出栈的时候将栈内存存放的数据放置到PC寄存器中,这个 ...

不应该是 pop{LR} 吗?然后 mov pc,lr
回复

使用道具 举报

4

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2019-11-13
在线时间
39 小时
发表于 2020-4-27 15:51:47 | 显示全部楼层
本帖最后由 q1009523480 于 2020-4-27 15:54 编辑

我是这样理解的,LR寄存器保存的是子函数的返回地址,当调用子程序时,将LR的值压栈(保存)。子程序调用结束后,子函数就要用到LR去返回,当出栈PC寄存器(将原来LR的值赋给PC寄存器)时,程序就会跳回原来的调用处。
回复

使用道具 举报

57

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2019-11-13
在线时间
40 小时
 楼主| 发表于 2020-4-28 10:23:43 | 显示全部楼层
q1009523480 发表于 2020-4-27 15:51
我是这样理解的,LR寄存器保存的是子函数的返回地址,当调用子程序时,将LR的值压栈(保存)。子程序调用结 ...

pc并没有入栈啊,怎么 pop{pc}
回复

使用道具 举报

4

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2019-11-13
在线时间
39 小时
发表于 2020-4-28 10:52:46 | 显示全部楼层
uestczcl 发表于 2020-4-28 10:23
pc并没有入栈啊,怎么 pop{pc}

这和PC入栈没有关系,你可以这样想象,把栈比作一个杯子,现在先PUSH {LR},就是把LR的值放到杯子里面。然后POP {PC},就是把杯子里面的值再拿出来给PC。还不清楚可以去搜一下堆栈相关的知识。
回复

使用道具 举报

57

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2019-11-13
在线时间
40 小时
 楼主| 发表于 2020-4-28 12:00:39 | 显示全部楼层
q1009523480 发表于 2020-4-28 10:52
这和PC入栈没有关系,你可以这样想象,把栈比作一个杯子,现在先PUSH {LR},就是把LR的值放到杯子里面。 ...

pop是弹出栈顶处的数据的嘛,不应该是 pop{LR} 吗?然后 mov pc,lr
回复

使用道具 举报

4

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2019-11-13
在线时间
39 小时
发表于 2020-4-28 16:00:00 | 显示全部楼层
uestczcl 发表于 2020-4-28 12:00
pop是弹出栈顶处的数据的嘛,不应该是 pop{LR} 吗?然后 mov pc,lr

这两种操作不是一样的吗?直接POP {PC}多简单
回复

使用道具 举报

57

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
279
金钱
279
注册时间
2019-11-13
在线时间
40 小时
 楼主| 发表于 2020-4-29 09:42:08 | 显示全部楼层
q1009523480 发表于 2020-4-28 16:00
这两种操作不是一样的吗?直接POP {PC}多简单

明白了,谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 09:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表