单片机的问题: PC的值是不是等于栈指针SP的值?也就是说(PC)=(DPH)+(DPL)?

程序如下:
POP DPH
POP DPL
MOV DPTR,#4000H
RL A
MOV B,A
MOVC A,@A+DPTR
PUSH ACC
MOV A,B
INC A
MOVC A,@A+DPTR
PUSH ACC
RET
ORG 4000H
DB 10H,80H,30H,50H,30H,50H
最后(PC)=?,(SP)=?
求具体解释。
对了,执行前有:(A)=02H,(SP)=52H,(51H)=FFH,(52H)=FFH
这个是书上的课后习题,没搞懂原因

有个概念必须首先搞清楚:
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)不成立
温馨提示:内容为网友见解,仅供参考
第1个回答  2015-12-13
要回到ret的机制上说。按道理所给程序应该有call指令,这样我们知道程序返回到哪里,而这里没有call
注意:相当于模拟了一次子程序调用过程,先压入pcl,再压入pch,即两次的PUSH ACC
而ret指令将压入的这两个字节,即50h,和30h作为pc值弹出,sp-2
第2个回答  2011-08-15
DPTR是十六位的,PC指针是八位的。你的标题上说的应该是DPTR=(DPH)+(DPL)。
程序里RET回到哪里也没写清楚,RET后指针PC回到那之后的程序地址去啦,SP指向PC的下一个啊。

单片机的问题: PC的值是不是等于栈指针SP的值?也就是说(PC)=(DPH)+...
DPTR在送#4000H赋值后再未变过。所以:(PC)=(DPH)+(DPL)不成立

看看这道单片机题
而这种变化就体现在SP中值的变化,看图2,SP中的值等于27H不就相当于是一个指针指向27H单元吗?当然在真正的51机中,开始指针所指的位置并非就是数据存放的位置,而是数据存放的前一个位置,比如一开始指针是指向27H单元的,那么第一个数据的位置是28H单元,而不是27H单元,为什么会这样,我们在学...

51单片机的 pc值怎么算?
因为ret指令返回时,出栈的结果是高地址=(52h)=50h;而低地址=(51h)=30h;故最终结果pc值是5030h;

关于单片机的问题
(1)首先该问题是针对51单片机的问题;(2)单片机弹出堆栈是先取内容,在调整指针,即:(sp)=》DPH、DPL、A,sp-1=>sp执行三次。(3)执行步骤为:(42H)->DPH, 42h-1->sp;(41H)->DPL, 41h-1->sp;(40H)->A, 40h-1->sp;(4)因此,(DPH)=60H;(DPL)=70H;(A)=80H;(S...

关于单片机堆栈指针sp变化的问题
为什么不是(SP)=4FH ?应该是4FH。问题二:那50H岂不是没利用到?50H是不用的。复位后,SP=07H。 但是,07H就从来不用于堆栈。第一次压栈,是压入了08H单元。

求汇编中可以互换的指令,高分!满意再加分!
JMP @A+DPTR ;(A)+ (DPTR)→(PC),累加器所指向地址单元的值加上数据指针的值给程序计数器赋予新值 [2]. 条件转移指令(8条) JZ rel ; A=0,(PC)+ 2 + rel→(PC),累加器中的内容为0,则转移到偏移量所指向的地址,否则程序往下执行 JNZ rel ; A≠0,(PC)+ 2 + rel→(PC),累加器中的内容...

与中断有关特殊功能寄存器有哪些?
复位时PC = 0000H (2)堆栈指针SP 指明栈顶元素的地址,8位,可软件设置初值,复位时SP = 07H (3)数据指针DPTR R0、 @R1、@DPTR;指明访问的数据存储器的单元地址,16位,寻址范围64KB。 DPTR = DPH + DPL。可以用它来访问外部数据存储器中的任一单元,如果不用,也可以作为通用寄存器来用...

单片机的基本指令有哪些?
需要指出的是,单片机开机复位后,(SP)默认为07H,但一般都需要重新赋值,设置新的SP首址。入栈的第一个数据必须存放于SP+1所指存储单元,故实际的堆栈底为SP+1所指的存储单元。 \\x0d\\x0a\\x0d\\x0aPUSH data ;(SP)+1→(SP),(data)→(SP) 堆栈指针首先加1,直接寻址单元中的数据送到堆栈指针SP所指的...

c51的指针类型
1. 指令指针(PC):用于存储下一条要执行的指令的地址。2. 数据指针(DPTR):用于存储数据地址。C51的数据指针是16位的,可以访问16位的地址空间。3. 堆栈指针(SP):用于存储栈顶地址。C51的堆栈指针是8位的。4. 数据指针的高8位(DPH)和低8位(DPL):DPTR可以拆分为高8位的DPH和低8位...

什么是单片机的特殊功能寄存器
特殊功能寄存器是用来对片内各功能模块进行管理、控制、监视的控制寄存器和状态寄存器,是一个特殊功能的RAM区。它是单片机中最具有特色的部分,现在几乎所有功能的增加和扩展都是通过增加特殊功能寄存器来达到目的的。英文缩写为SFR,是Special Function Register(特殊功能寄存器)的缩写。

相似回答