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,这两条指令的顺序是不能变的 总的来说,就是网上说的那样:先进后出,自己慢慢理解一下,字打多了,我自己不知道自己在说什么了 |
笨笨兔 发表于 2020-1-10 08:53 抱歉,还没有啥结果 |
hantu 发表于 2020-1-10 01:12 对汇编不太熟悉,仔细调试一下 |
mffhxa 发表于 2020-1-10 00:22 好的,多谢指教 |
POP PUSH指令研究: 就研究出来这样的结果? |
单步调试一下不就看得清清楚楚的么 |
7、6、5.。。。。0应该是指工作寄存器,估计是指0组的R7、R6。。。。。R0,但POP后面直接用7表示R7的话,那必须头文件里对R7的地址做好定义才行,其它特殊功能寄存器也是一样。 |