打印

请教关于PUSH 和 POP

[复制链接]
2516|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tiandiheyi|  楼主 | 2008-4-30 09:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
tiandiheyi|  楼主 | 2008-4-30 09:18 | 只看该作者

补充

PUSH POP 是用在终端程序里还是所有函数都能写PUSH POP ?

使用特权

评论回复
板凳
computer00| | 2008-4-30 10:01 | 只看该作者

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

使用特权

评论回复
地板
tiandiheyi|  楼主 | 2008-4-30 11:12 | 只看该作者

PUSH 和 POP 是成对的

我在延时程序  Delay 里加了PUSH R1 TO [SP] 和  POP 就不行了。去掉就可以了。


调用它的程序压过一次R1 ,会是这样的原因吗?

使用特权

评论回复
5
computer00| | 2008-4-30 11:26 | 只看该作者

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

使用特权

评论回复
6
HWM| | 2008-4-30 12:35 | 只看该作者

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

栈是一个一头开放的线性数据结构,固定端为栈底,活动(或开放)端为栈顶。数据的存放只能从开放端进行(有点象叠放的书只能从上面放或取,不能从中间抽或插)。这样的结构涉及到两个问题,其一是栈底的定位,这是栈初始化必须做的,其二是栈顶操作,一般要求存取成对地配合操作。

在MCS-51中初始(复位)栈底定位在RAM地址8(SP为7),如果RAM中仅使用BANK0中的R0..R7就不用考虑栈底重定位。但这种情况太少,多数还是要在复位后根据RAM的使用情况对栈底进行重新定位(重设SP致栈底减一)。

设置完栈底后就可以使用栈来暂存数据或传输参数了和创建局部变量(由于MCS-51的RAM有限,后两重情况基本没用)了。在使用中只要注意PUSH和POP的配套成对使用,一般不回出现问题(除非超出了RAM的容量)。栈使用最多的是子程序(包括中断服务程序)中的寄存器和程序状态字PSW等运行现场状态的保护。一般形式为:

sub:           ; or isr
    push reg0
    push reg1
    ...
    push reg7
    push psw

    ...

    pop  psw
    pop  reg7
    ...
    pop  reg1
    pop  reg0
    ret        ; or reti

在程序中也可以利用栈来暂存一些数据,如:

    push ACC   ; save A

    ...

    pop  ACC   ; restore A



    push B     ; save B

    ...

    pop  B     ; restore B

等等

总之必须有存有取,存取配对。

使用特权

评论回复
7
zusen| | 2008-4-30 16:38 | 只看该作者

要注意进和出的顺序

后进 先出

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

59

帖子

0

粉丝