很奇怪,堆栈指针SP的问题!!
堆栈指针SP的问题,很奇怪,大家进来看一下,谢谢org 0000h
ajmp main
org 0050h
main:mov sp,#32h
mov 30h,#50h
mov 31h,#5Fh
mov 32h,#3ch
POP DPH;
POP DPL;
POP SP;
nop
end
运行完以上程序后,我不理解为什么sp=50h,执行POP SP首先把(30H)=50H的内容给SP,然后因为是出栈所以要减一不是吗?为什么不是(SP)=4FH ? 51指令系统
堆栈操作指令的解释是这样的:
(1)进栈
PUSHdirect ; (SP)+1→SP,(direct)→(SP)
(2)推栈
POP direct ;((SP))→direct,(SP)-1→(SP) 回复【楼主位】4555
-----------------------------------------------------------------------
实验证明的确有问题,但是你这样做有意义吗?
你这样的堆栈没多少实用价值啊。 当然是50H,因为你前面有一句mov 30h,#50h
当执行到pop sp时,会把30H单元内容送入SP ((SP))→direct,(SP)-1→(SP) 这个过程只能在机器周期里来理解,不能用于时基周期。 POP direct ; ((SP))→direct,(SP)-1→(SP)
操作【1】:pop SP 产生 sp-1 的操作是由硬件直接改写,没有通过地址总线和数据总线,
操作【2】:而【((SP))→direct】中的赋值操作必须通过内部地址总线和数据总线读取【((SP))】改写【→direct】寄存器,
这一操作【2】相对于前一操作【1】要慢上若干时钟周期,
所以即使 sp-1操作在后,也会提前完成。 mark 回复【3楼】BDXing6
当然是50h,因为你前面有一句mov 30h,#50h
当执行到pop sp时,会把30h单元内容送入sp
-----------------------------------------------------------------------
有道理,我刚才试了下。确实如此
到弹出指令pop时:
sp=32h-->(3ch)“POP DPH”(将3ch压入DPH)
sp-1=31h-->(5fh)“POP DPL”(将5fh压入DPL)
sp-1=30h-->(50h)“POP SP”(将50h压入SP)
最后一个pop是把目前指针对着的地址内容压入sp,此时未执行压入指令之前,sp=30h,对应的地址里面装得数据是50h。
页:
[1]