有个概念必须首先搞清楚:
SP:栈寄存器
(SP):栈寄存器的内容,也就是堆栈区的起始地址
(SP) = #52H,代表当前栈指针指向的是内部RAM地址为52H的寄存器。
程序分析:
POP DPH ;(52H)=>(DPH) = #0FFH,(SP)-1,即(SP) = #51H
POP DPL ;(51H)=>(DPL) = #0FFH,(SP)-1,即(SP) = #50H
MOV DPTR,#4000H ;DPTR重新赋值,所以上两句对DPTR的修改无意义
RL A ;(A) = #04H,A原为02
MOV B,A ;(B) = #04
MOVC A,@A+DPTR ;(A) = #30H(查表得到第1个字节内容)
PUSH ACC ;压栈,(SP)+1,即(SP) = #51H,(51H)= #30H
MOV A,B ;(A) = #04
INC A ;(A) = #05
MOVC A,@A+DPTR ;(A) = #50H(查表得到第2个字节内容)
PUSH ACC ;再压栈,(SP)+1, 即(SP) = #52H,(52H)= #50H
RET ;返回。RET相应操作过程:
(SP) = #52H (52H) = #50H #50H ==> (PC高8位)
(SP) - 1 (SP) = #51H
(SP) = #51H (51H) = #30H #30H ==> (PC低8位)
(SP) - 1 (SP) = #50H
所以:
(PC) = #5030H
(SP) = #50H
DPTR在送#4000H赋值后再未变过。所以:(PC)=(DPH)+(DPL)不成立
要回到ret的机制上说。按道理所给程序应该有call指令,这样我们知道程序返回到哪里,而这里没有call
注意:相当于模拟了一次子程序调用过程,先压入pcl,再压入pch,即两次的PUSH ACC
而ret指令将压入的这两个字节,即50h,和30h作为pc值弹出,sp-2
DPTR是十六位的,PC指针是八位的。你的标题上说的应该是DPTR=(DPH)+(DPL)。
程序里RET回到哪里也没写清楚,RET后指针PC回到那之后的程序地址去啦,SP指向PC的下一个啊。