已知程序执行前有A=02H,SP=52H,(51H)=FFH,(52H)=FFH。下列程序执行后:

已知程序执行前有A=02H,SP=52H,(51H)=FFH,(52H)=FFH。下列程序执行后:
POP DPH
POP DPL
MOV DPTR,#4000H
RL A
MOV B,A
MOVC A,@A+DPTR
PUSH A
MOV A,B
INC A
MOVC A,@A+DPTR
PUSH A
RET
ORG 4000H
DB 10H,80H,30H,50H,30H,50H

能不能对语句解析下

在前人的基础上修改。
POP DPH ; (52H)赋值给DPH,这个关系一直存在,知道程序结束。 SP= 51 H,
POP DPL ;(51H)赋值给DPL,SP=50H
MOV DPTR,#4000H ;DPTR=#4000H
RL A ;A=04H ;16进制左移一位,先化为二进制过程更明显。
MOV B,A ;B=04H
MOVC A,@A+DPTR ;查表得A=30H , 是从00H开始 查表的。
PUSH A cc ;将A 中的值赋值给,上一个空出位51H,(51H)=DPL 。 因为SP指针指向的栈 ,是有值的, 只有比他高的地址是空的。如指向(01H),那么(01H)中有值,(02H),(03H)….. 中没值。
MOV A,B ;A=04H
INC A ;A=05H
MOVC A,@A+DPTR ;查表A=50H
PUSH A ;将A 的值赋给 再上一个空位,(52H)=DPH 。
RET ;子程序结束!
ORG 4000H
DB 10H,80H,30H,50H,30H,50H
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2018-02-27
POP DPH ;SP=51H
POP DPL ;SP=50H
MOV DPTR,#4000H ;DPTR=#4000H
RL A ;A=04H(02H*2)
MOV B,A ;B=04H
MOVC A,@A+DPTR ;查表A=30H
PUSH A ;SP=51H,(51H)=#30H
MOV A,B ;A=04H
INC A ;A=05H
MOVC A,@A+DPTR ;查表A=50H
PUSH A ;SP=52H,(52H)=#50H
RET
ORG 4000H
DB 10H,80H,30H,50H,30H,50H本回答被网友采纳
第2个回答  2019-12-25
POP DPH ;SP=51H
POP DPL ;SP=50H
MOV DPTR,#4000H ;DPTR=#4000H
RL A ;A=04H(02H*2)
MOV B,A ;B=04H
MOVC A,@A+DPTR ;查表A=30H
PUSH A ;SP=51H,(51H)=#30H
MOV A,B ;A=04H
INC A ;A=05H
MOVC A,@A+DPTR ;查表A=50H
PUSH A ;SP=52H,(52H)=#50H
RET ;RET指令弹出断点位置即SP最近两字节数据SP=SP-2=50H,PC=5030(大端对齐)
ORG 4000H
DB 10H,80H,30H,50H,30H,50H
第3个回答  2021-05-06
RET前面的代码都很简单,主要是对RET的理解,它实现的基理是堆栈。执行RET时,SP先后将所指内容pop给PCH,PCL(即PC的高8位和低8位,对应的就是(52H)=50H,(51H)=30H),因此最后SP-2,那SP=50H本回答被网友采纳
第4个回答  2011-10-17
自己看看

已知程序执行前有A=02H,SP=52H,(51H)=FFH,(52H)=FFH。下列程序执行后...
时,将从 4000h 处,读出 30h、50h;当 a = 2 时,将从 4000h 处,读出 30h、50h。本题目,就是 a=2。读出来了 30h、50h,先后压栈,再执行 ret。ret 指令,就是把堆栈中的两个字节,送到 pc。那么,pc=5030h,就是这么来的。

已知程序执行前有A=02H,SP=52H,(51H)=FFH,(52H)=FFH。下列程序执行后...
在前人的基础上修改。POP DPH ; (52H)赋值给DPH,这个关系一直存在,知道程序结束。 SP= 51 H,POP DPL ;(51H)赋值给DPL,SP=50H MOV DPTR,#4000H ;DPTR=#4000H RL A ;A=04H ;16进制左移一位,先化为二进制过程更明显。MOV B,A ;B=04H MOVC A,@A+DPTR ;查...

已知程序执行前有A=02H,SP=52H,(51H)=FFH,(52H)=FFH。下述程序执行后...
A=(50H), SP=(50H), (51H)=(FFH), (52H)=(FFH), PC=(未知) 原因:这只是一个子程序,根本没法找到程序运行地址,除非你写全所有程序。

看看这道单片机题
POP DPH sp指向52H,所以把52里的内容送给DPH,DPH=0FFH,然后sp减1 POP DPL 指向51H,所以把51里的内容送给DPL=0FFH,然后sp减1 MOV DPTR,#4000H 把4000H送给0FFFF地址,也就是片外存储器 RL A 左移A 00000010变为00000100,变为04H MOV B,A 把A送给B寄存器,此时B为04H MOVC A,@A+D...

51单片机的 pc值怎么算?
上面程序执行完之后:(A)=50H;sp=50H(因为在程序中,sp减了两次,后来又加了两次,在程序最后ret有在返回的时候减了两次,即地址出栈,故最终结果是50h。(51h)=30h;(52h)=50h;因为ret指令返回时,出栈的结果是高地址=(52h)=50h;而低地址=(51h)=30h;故最终结果pc值是5030h;...

单片机的一道题 我和答案对不上 不知道是不是我错了 求大神求一下答案...
52H FFH 测试程序 ORG 0000H LJMP 0030H ORG 0030H main:MOV A,#02H MOV SP,#52H MOV 51H,#0FFH MOV 52H,#0FFH POP DPH POP DPL MOV DPTR,#4000H RL A \/\/A = 04H MOV B,A \/\/B = 04H MOVC A,@A+DPTR \/\/A = 30H PUSH ACC \/\/30H 入...

...PC的值是不是等于栈指针SP的值?也就是说(PC)=(DPH)+(DPL)?_百度知...
(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...

关于单片机的一道程序题目
MOVC A,@A+DPTR ;将5+4000H(也就是4005H)的数据送到A,所以A=50H PUSH A ;将A的数据压入52H,(52H)=50H RET ;52H、51H的数据弹出,成为PC地址 最后结果:A=50H、SP=50H、(51H)=30H、(52H)=50H、PC=3050H 天哪,我也晕了,堆栈是压栈+1还是-1忘记了,堆栈...

单片机8051堆栈问题程序
;已知 (A) = 02H, (SP) = 40H, (41H) = FFH, (42H) = FFH;这是一个子程序,调用时PC由硬件自动入栈,所以调用后SP = 40H+2 = 42H,而42H处值=FFHPOP DPH;出栈,栈数据放到DPH和DPL,这时DPTR = FFFFHPOP DPL ;因为开始SP =42H,出栈后SP = 42H - 2 = 40HMOV DPTR...

汇编试题解答
9.设BX=1200H,SI=0002H,DS=3000H,(31200H)=50H,(31201H)=02H,(31202H)=OF7H,(31203H)=90H请写出下列各条指令单独执行后,有关寄存器及存储单元的内容,若该指令影响标志位,则指出其值。A. DEC BYTE PTR〔1200H〕 ; 问:(31200)=4FH, CF=原来CF的值(DEC指令不影响...

相似回答