单片机8051堆栈问题程序

单片机8051堆栈问题程序求大神告诉过程和答案

;已知 (A) = 02H, (SP) = 40H, (41H) = FFH, (42H) = FFH
;这是一个子程序,调用时PC由硬件自动入栈,所以调用后SP = 40H+2 = 42H,而42H处值=FFH

POP  DPH ;出栈,栈数据放到DPH和DPL,这时DPTR = FFFFH
POP  DPL      ;因为开始SP =42H,出栈后SP = 42H - 2 = 40H
MOV  DPTR,#3000H ;向寄存器DPTR写入数据3000H
RR   A ;A右移一次,A=02H=0000 0010 -->0000 0001=01H
MOV  B,A ;B = A = 01H
MOVC A,@A+DPTR ;将ROM地址 A+DPTR = 01H+3000H = 3001H 处的数据读到A中
PUSH ACC  ;将 读到的数据 推入栈,看数据区3001H处 = 10H
;入栈是先SP+1,再读入数据,所以(41H) = 10H,SP = 41H
MOV  A,B ;A = B = 01H
INC  A ;A = 01H+1 = 02H
MOVC A,@A+DPTR ;读取ROM 3002H地址单元的内容:80H
PUSH ACC  ;将 读到的数据 推入栈,这时(42H) = 80H,SP = 40H
RET  ;返回时,PC由硬件出栈,因为这时SP已经不是42H,而且程序一开始
;就执行POP导致PC入栈值读出来,然后经过MOV DPTR,#3000H语句就丢失掉了,程序可能回不到
;调用前的地方,而是跑到 读取到的数据 1080H这个地方了,所以执行完后PC = 1080H

;--数据地址区----------
ORG  3000H
DB   10H,80H,30H,50H,30H,50H

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-06-25

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网