早教吧 育儿知识 作业答案 考试题库 百科 知识分享

关于堆栈的取数:例如:设(AX)=1122H,(BX)=3344H,(CX)=5566H,(SP)=2000H,试分析下列程序执行后,AX,BX,CX,SP中的内容各是多少?PUSHAXPUSHBXPUSHCXPOPAXPOPCX(AX)=5566H,(BX)=3344H,(CX)=3344H,(SP)=1FFEH.这是为什么呢?1FFD1122--

题目详情
关于堆栈的取数:
例如:设(AX)=1122H,(BX)=3344H,(CX)=5566H,(SP)=2000H,试分析下列程序执行后,AX,BX,CX,SP中的内容各是多少?
PUSH AX
PUSH BX
PUSH CX
POP AX
POP CX
(AX)=5566H,(BX)=3344H,(CX)=3344H,(SP)=1FFEH.
这是为什么呢?
1FFD 1122-----> SP
1FFE 3344
1FFF 5566
为什么1122是栈首地址?而不是5566呢?像这1FFD,1FFE,1FFF是怎么求出来的呢?
▼优质解答
答案和解析
堆栈是先进后出,在所有push完后是这样
地址 值
1FFD 1122-----> SP
1FFE 3344
1FFF 5566
pop AX后, AX被赋值最后一个,=5566, SP=Sp+1=1FFE
pop CX后, CX被赋值最后一个,=3344, SP=SP+1=1FFF
BX没有被赋值,所以还是原值, SP应该等于1FFF, 答案错误!
因为堆栈指针随着push pop命令变化,有几个push就要从指针初始值减几个, 几个pop就加几个, 你这样记就永远不会搞错指针的变化. 当然单片机中自己其他有命令会自动改变指针值,比如call 子程序等,但是结束后会恢复到自己本来call 子程序前的值.
另, 大多数单片机堆栈是减的, 也有堆栈是增加的. 那样的话就相反的方法来计算sp .