MCS-51 单片机指令系统LCALL指令问题

ORG 2000H

MOV SP, #40H
MOV A, #30H
LCALL SUBR
ADD A, #10H
MOV B, A
L1: SJMP L1

SUBR: MOV DPTR, #200AH
PUSH DPL
PUSH DPH
RET

请问执行后SP,A , B, PC,等于多少?具体怎么来的。特别是调用子程序回来继续这一步 的详细过程?
多谢大神回答

第1个回答  2014-09-20
容易造成困惑的有两个地方:
1、PUSH DPL 和 PUSH DPH
这里压栈了 DPTR 的值,这两条指令之后就是 RET 指令,RET 将会弹出这个值作为返回地址,于是SUBR 子程序返回到了 #200AH,就是 MOV B, A 那条指令,而不是 LCALL 紧接着的指令 ADD A, #10H,相当于这个 ADD A,#10H 指令没有被执行。
2、LCALL 指令压入的地址,没有被弹出
由于 SUBR 子程序 RET 弹出的地址,是压入的 DPTR 值,真正的 LCALL 指令压入的地址,还留在栈顶,所以 SUBR 子程序返回后的 SP 的值,也比原值 #40H 大了两个字节,变成了 #42H。

执行后,SP=#42H,A=#30H,B=#30H,PC=#200CH (注意 ADD A,#10H)没有执行)。追问

你好,关于2,LCALL进行了两次SP+1,而子程序也进行了两次PUSH操作以及RET。栈顶地址的变化是啊41,42,43,44,43,42。前两个是 LCALL指令引起的,后来43,44是PUSH,后来又因为RET,才降为42的吗?

追答

LCALL 之前,SP=#40H,然后,进入 SUBR 子程序:

SUBR: MOV DPTR, #200AH   ; 执行后 SP = #42H
PUSH DPL                 ; 执行后 SP = #43H
PUSH DPH                 ; 执行后 SP = #44H
RET                      ; 执行后 SP = #42H

本回答被提问者采纳
相似回答