找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2409|回复: 13
打印 上一主题 下一主题
收起左侧

求解汇编程序指令的运算过程及运算结果

[复制链接]
跳转到指定楼层
楼主
ID:957106 发表于 2021-7-29 11:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MOV 30H,#12
MOV 31H,#23
PUSH 30H
PUSH 31H
POP 30H
POP 31H

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:824490 发表于 2021-7-29 14:02 | 只看该作者
这只是移数、入栈、出栈的指令没有运算。最后的最后,30H=12,31H=23,均为10进数
回复

使用道具 举报

板凳
ID:957106 发表于 2021-7-29 14:16 | 只看该作者
名字不是重点 发表于 2021-7-29 14:02
这只是移数、入栈、出栈的指令没有运算。最后的最后,30H=12,31H=23,均为10进数

感谢回复!是怎么推出来的呢,我根据指令的解释推不出来
回复

使用道具 举报

地板
ID:668693 发表于 2021-7-29 14:42 | 只看该作者
把立即数12送入到30H
回复

使用道具 举报

5#
ID:668693 发表于 2021-7-29 14:49 | 只看该作者
将立即数12送入到30H
将立即数23送入到31H
将30H里面的立即数送入到一级堆栈
将31H里面的立即数送入到二级堆栈
根据堆栈后入先出原则那么30H先出栈的话那么他的数就是23,31H就是12
回复

使用道具 举报

6#
ID:957106 发表于 2021-7-29 15:53 | 只看该作者
林神经 发表于 2021-7-29 14:49
将立即数12送入到30H
将立即数23送入到31H
将30H里面的立即数送入到一级堆栈

PUSH 30H指令不应该是把12送到31H吗?然后PUSH 31H指令后又把12给了32H,我理解的,转不过来不知道咋移的
回复

使用道具 举报

7#
ID:123289 发表于 2021-7-29 16:18 | 只看该作者
51里有256个快速内存,何为快速?有指令直接访问有内存(读、写、甚至位操作),它的地址是00-FFH。
1、00-1FH:分成四块,00-07H,08-0FH,10-17H,18-1FH。它们对应R0-R7。
在PSW寄存器中,有两位(B43:RS1、RS0)决定R0-R7使用上术四块当中的哪一块。
例如,PSW.43=11时,R0就是18H,R7就是1FH;PSW.43=00时,R0就是00H,R7就是07H;
2、20-2FH:16个字节,128个位,这128个位是可以单独访问的(与、或、求反,测试),而其它内存就不一定有此特殊待遇了。
这128个位,可以用SBIT进行定义。例如:定义 20H.0 = INPUTMM1。即可以按位使用。
按位使用时,可以定义128个变量。当然也可以按字节使用。
按字节使用时,只能定义16个变量。
3、30H-7FH:归你,按字节使用。
4、80H-8FH:称为高端内存。低档的51中没有这128个字节,高档的51中有,高端内存只能间接访问!而低端内存(00-7FH)是直接、间接都可以访问。为什么要这样呢?因为高端存存与特殊寄存器重叠,同用80-8FH地址,要区分它们,就是用直接访问和间接访问来区分。
下面说到楼主的问题了:
特殊寄存器中有一个叫SP,它是堆栈指针,例如:SP=80H(由你设置任意设置):
PUSH 30H
30H就是前面(3、中介绍的),里面已放了一个数字12,这条指令就将30H中的12,存入SP所指的单元80H中,并将SP+1,让SP指向81H。
PUSH 31H  ;同理让31H中的23进入81H,SP+1,SP指向82H。
POP 30H
POP 操作与PUSH相反,PUSH是压堆,POP是弹栈!它先将SP-1,即SP从82H变成81H,再从81H中取出数字,送到目标寄存器,即将23送入30H。
POP 31H  ;同理将SP-1,SP=80H,再从80H中取出数字12,送到目标寄存器31H。
以上书上都有,老师也应该讲过,都是不认真学习的结果。

另出一题:
PUSH P0 是可以的
PUSH R0 是不可以的,为什么?
回复

使用道具 举报

8#
ID:824490 发表于 2021-7-29 16:42 | 只看该作者
林神经 发表于 2021-7-29 14:49
将立即数12送入到30H
将立即数23送入到31H
将30H里面的立即数送入到一级堆栈

对的,我也是好久没整汇编了。
回复

使用道具 举报

9#
ID:824490 发表于 2021-7-29 16:45 | 只看该作者
13355423860 发表于 2021-7-29 15:53
PUSH 30H指令不应该是把12送到31H吗?然后PUSH 31H指令后又把12给了32H,我理解的,转不过来不知道咋移的

单片机的堆栈,类似弹夹的原理,你细品一下就有白了。
回复

使用道具 举报

10#
ID:668693 发表于 2021-7-29 18:15 | 只看该作者
名字不是重点 发表于 2021-7-29 16:45
单片机的堆栈,类似弹夹的原理,你细品一下就有白了。

很形象
回复

使用道具 举报

11#
ID:401564 发表于 2021-7-29 22:38 | 只看该作者
堆栈是一个水管,只有一个入口和一个出口
堆栈的处理就是把东西挤到水管里和取出来的处理,挤得多了,超过水管的长度了,最先挤进去的就会从另一头给挤掉地上,你永远找不到了,这叫溢出
挤进去的时候是一个一个挤进去的,取出来肯定也是一个一个取出来,最后挤进去的就先取出来
PUSH和POP就是一个进和出的功能
PUSH A就是把A里头的东西放入堆栈
POP A就是把最外面一层堆栈的内容放到A里头
如果这样还不明白,直接放弃汇编
回复

使用道具 举报

12#
ID:88256 发表于 2021-7-29 23:03 | 只看该作者
13355423860 发表于 2021-7-29 15:53
PUSH 30H指令不应该是把12送到31H吗?然后PUSH 31H指令后又把12给了32H,我理解的,转不过来不知道咋移的

还是得认真仔细的去理解堆栈和出栈
回复

使用道具 举报

13#
ID:386001 发表于 2021-8-2 18:42 | 只看该作者
出入栈,均不改变栈里的内容,只是改变了SP指针的指向
回复

使用道具 举报

14#
ID:858964 发表于 2021-8-2 19:00 | 只看该作者
本帖最后由 Kxuan163 于 2021-8-2 19:07 编辑
林神经 发表于 2021-7-29 14:49
将立即数12送入到30H
将立即数23送入到31H
将30H里面的立即数送入到一级堆栈

正解。
我再补充一下,堆栈的进出次序是“后进先出”:
第5条指令 POP 30H ; 地址为30H的内存单元 <--栈顶内容#23
第6条指令 POP 31H  ;  地址为31H的内存单元 <-- 栈内容#12
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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