标题: 51单片机的 POP PUSH指令研究 [打印本页]

作者: 电子95    时间: 2020-1-9 18:01
标题: 51单片机的 POP PUSH指令研究
最近在研究RTOS,在程序中看到一个 POP 7 POP 6 POP ... ,请问大家这个7是什么,POP执行之后 什么会被动了什么?




作者: mffhxa    时间: 2020-1-10 00:22
7、6、5.。。。。0应该是指工作寄存器,估计是指0组的R7、R6。。。。。R0,但POP后面直接用7表示R7的话,那必须头文件里对R7的地址做好定义才行,其它特殊功能寄存器也是一样。
作者: hantu    时间: 2020-1-10 01:12
单步调试一下不就看得清清楚楚的么
作者: 笨笨兔    时间: 2020-1-10 08:53
POP PUSH指令研究: 就研究出来这样的结果?
作者: 电子95    时间: 2020-1-10 15:40
mffhxa 发表于 2020-1-10 00:22
7、6、5.。。。。0应该是指工作寄存器,估计是指0组的R7、R6。。。。。R0,但POP后面直接用7表示R7的话,那 ...

好的,多谢指教
作者: 电子95    时间: 2020-1-10 15:41
hantu 发表于 2020-1-10 01:12
单步调试一下不就看得清清楚楚的么

对汇编不太熟悉,仔细调试一下
作者: 电子95    时间: 2020-1-10 15:41
笨笨兔 发表于 2020-1-10 08:53
POP PUSH指令研究: 就研究出来这样的结果?

抱歉,还没有啥结果
作者: Y_G_G    时间: 2020-1-11 15:20
以常用的汇编中断处理来说吧:
PUSH          ACC                      ;把ACC压入栈
PUSH          PSW                     ;把PSW压入栈

---------中间是某段代码-----
POP           PSW                     ;把栈的值弹回PSW
POP           ACC                      ;把栈的值弹回ACC
这就是汇编中的堆栈,它是一个处理事件的方
你不用管它是进入中断还是要干嘛,你只要知道它是这么一个过程就可以了:
1,把ACC压入栈,这个时候ACC在栈的最上面的地址,假设这个地址是:0   (PUSH          ACC)
2,把PSW压入栈,这个时候,PSW就在刚才ACC呆的地址,ACC就被压到了下一个地址,那么:PSW在0地址,ACC在1地址,(PUSH          PSW)
如果还有PUSH指令,之前入栈的值就会不断的向下压,压过头了,就没了,这就是常说的"溢出"
在8051系统里,堆栈是软件堆栈,它是由系统自动处理的,理论上来说程序空间有多大,它就能入栈多少次,但实际就100多地址可以放,足够绝大多数的程序了
而有的单片机系统是硬件堆栈,它有的只有三四层的堆栈,也就是说它只能PUSH三四次而已,像这种可以算是堆栈资源非常有限,编程就会有要求:禁止使用递归,中断里最好不有函数,处理什么东西最好是在中断外处理
3,POP           PSW     ;这个指令是:把堆栈的最顶层的数据弹回PSW,理解这个很重要,它是把地址0的数据传送到PSW,这是出栈的顺序
4,POP           ACC     ;把地址1的数据弹回ACC,这两条指令的顺序是不能变的
总的来说,就是网上说的那样:先进后出,自己慢慢理解一下,字打多了,我自己不知道自己在说什么了


作者: 小菜鸡鸭鸭    时间: 2021-5-20 09:42
Y_G_G 发表于 2020-1-11 15:20
以常用的汇编中断处理来说吧:
PUSH          ACC                      ;把ACC压入栈
PUSH          PSW                ...

说的很清楚,哈哈,领教了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1