请教关于PUSH 和 POP

[复制链接]
3192|6
 楼主| tiandiheyi 发表于 2008-4-30 09:13 | 显示全部楼层 |阅读模式
TI, hp
PUSH&nbsp;一般用在什么地方?<br />&nbsp;<br />为什么我写了PUSH&nbsp;&nbsp;POP之后,RETI&nbsp;跳不出去了?<br /><br />详细点好啊!谢了!
 楼主| tiandiheyi 发表于 2008-4-30 09:18 | 显示全部楼层

补充

PUSH&nbsp;POP&nbsp;是用在终端程序里还是所有函数都能写PUSH&nbsp;POP&nbsp;?
computer00 发表于 2008-4-30 10:01 | 显示全部楼层

PUSH是压栈,POP是出栈,两者的数量要相等,否则栈指针就不

  
 楼主| tiandiheyi 发表于 2008-4-30 11:12 | 显示全部楼层

PUSH 和 POP 是成对的

我在延时程序&nbsp;&nbsp;Delay&nbsp;里加了PUSH&nbsp;R1&nbsp;TO&nbsp;[SP]&nbsp;和&nbsp;&nbsp;POP&nbsp;就不行了。去掉就可以了。<br /><br /><br />调用它的程序压过一次R1&nbsp;,会是这样的原因吗?
computer00 发表于 2008-4-30 11:26 | 显示全部楼层

用keil软仿真单步调试下看看吧,或许堆栈溢出了

  
HWM 发表于 2008-4-30 12:35 | 显示全部楼层

先弄懂什么是栈,才可能谈论PUSH和POP的使用

栈是一个一头开放的线性数据结构,固定端为栈底,活动(或开放)端为栈顶。数据的存放只能从开放端进行(有点象叠放的书只能从上面放或取,不能从中间抽或插)。这样的结构涉及到两个问题,其一是栈底的定位,这是栈初始化必须做的,其二是栈顶操作,一般要求存取成对地配合操作。<br /><br />在MCS-51中初始(复位)栈底定位在RAM地址8(SP为7),如果RAM中仅使用BANK0中的R0..R7就不用考虑栈底重定位。但这种情况太少,多数还是要在复位后根据RAM的使用情况对栈底进行重新定位(重设SP致栈底减一)。<br /><br />设置完栈底后就可以使用栈来暂存数据或传输参数了和创建局部变量(由于MCS-51的RAM有限,后两重情况基本没用)了。在使用中只要注意PUSH和POP的配套成对使用,一般不回出现问题(除非超出了RAM的容量)。栈使用最多的是子程序(包括中断服务程序)中的寄存器和程序状态字PSW等运行现场状态的保护。一般形式为:<br /><br />sub:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;or&nbsp;isr<br />&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;reg0<br />&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;reg1<br />&nbsp;&nbsp;&nbsp;&nbsp;...<br />&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;reg7<br />&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;psw<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;...<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;psw<br />&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;reg7<br />&nbsp;&nbsp;&nbsp;&nbsp;...<br />&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;reg1<br />&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;reg0<br />&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;or&nbsp;reti<br /><br />在程序中也可以利用栈来暂存一些数据,如:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;ACC&nbsp;&nbsp;&nbsp;;&nbsp;save&nbsp;A<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;...<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;ACC&nbsp;&nbsp;&nbsp;;&nbsp;restore&nbsp;A<br /><br />或<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;save&nbsp;B<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;...<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;&nbsp;restore&nbsp;B<br /><br />等等<br /><br />总之必须有存有取,存取配对。<br />
zusen 发表于 2008-4-30 16:38 | 显示全部楼层

要注意进和出的顺序

后进&nbsp;先出
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

59

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部