答案:根据我的理解,PUSH和POP并不是非用不可的指令,无非是临时保护一下有可能会被破坏的寄存器数据,你也可以手动将这些数值保存到一个中间暂存的寄存器,等突发事件(通常是中断)过后,再把原来的值取回来,效果一样,但你必须设置一些寄存器来做暂存器。但是用PUSH和POP可以更方便地保存一大堆需要保护的数据,两者通常都是成对出现的,如果你不POP,那你PUSH干嘛?同时你必须记住后进先出的原则,如果顺序搞错,那么数值就全乱了。
如果你非要不成对出现,也可以啊。比如,你先PUSH ACC 再PUSH 60H,然后进行一大堆的操作,突然再来一个PUSH ACC ,这样也没人说你不可以呀,只是你要记住,堆栈那里进了3个值,分别是第一次的A值,60H那里的值,第二次的A值。然后你开始回复数据,假如你不想要第一次的A值了,你可以只POP ACC 和POP 60H,这样就是三个PUSH,却只用了两个POP,可以呀,编译不会指出你有错误,但是你自己要记住,还有一个值存着,没有取出,就是第一次的A值。当下一次你再进行PUSH的时候,请记得这一点,那个值一直存着,不会被清理掉,直到你所使用的POP还清了“欠”PUSH的“债”。
以上讲那么多,只是想说明,没有什么是死的,只要你了解它的处理过程,像楼上兄弟所说的,堆栈只是一个指针,你只要明白它当前指向哪里,就可以活用它。比如上面我所说的例子,如果你想让A跟60H交换一个数值,只需要把后进先出的顺序颠倒一下,用后进后出就可以了:
PUSH ACC
PUSH 60H
………………
POP ACC
POP 60H
注意,上面不是通常的出栈顺序,其结果就是ACC和60H的值对调了一下。
其他:所谓Push和pop从本质上讲是堆栈指针的移动。
如果你能保证指针移动正确,也可以不配对使用。 PUSH和POP指令必须成对出现,否则出错;在不影响返回后的程序的值,可不需要;一般中断程序都要用到,例如:累加器A,影响A的值,就必须要用PUSH ACC和POP ACC;在用到查表时两者都用到DPTR时,就必须要用PUSH DPH PUSH DPL和POP DPL POP DPH,如果影响到C,Ri时就必须要用PUSH PSW和POP PSW等 这个是堆栈的操作,你想想,把数据压入(PUSH)堆栈,不弹出来(POP)栈顶指针怎么变化啊?所以必须要成对出现!否则编译会报错!
上一个:片内RAM40H开始的单元内有10个二进制数,编程找出其中最大值并存于50H单元中 用汇编语言编写,标上注释
下一个:求该汇编语言的翻译,在线等ORG 0000H AJMP MAIN ORG 0030H MAIN:MOV SP,40H MOV R7,#7 ;计数用 MOV R6,#7