
CLR C CY=0
MOV R2,#3 R2=03H R2=02HR2=01H
LOOP:
MOV A,@R0 A=70H A=80H A=A0H
ADDC A,@R1CY=1,A=10H CY=0,A=F0HCY=1,A=16H
MOV @R0,A (20H)=10H (21H)=F0H (22H)=16H
INCR0 R0=21H R0=22HR0=23H
INCR1 R1=26H R1=27HR1=28H
DJNZ R2,LOOP
JNCNEXT
MOV @R0,#01H 23H=01H
SJMP $
NEXT: DECR0
SJMP $
结果:(20H)=10H ,(21H)=F0H ,(22H)=16H ,(23H)=01H ,(A)=16H ,(CY)=1 .
分析过程参照注释
POP DPHPOP DPL ;d出堆栈2次,SP=50HMOV DPTR,#4000H ;DPTR=4000H
RL A ;A由02变成04H
MOV B,A ;A的数据送到B暂存
MOVC A,@A+DPTR ;将4+4000H(也就是4004)的数据送到A 最后两行表示DB后面的数据依此在4000H开始的单元中,30H在4004H单元。所以A=30H
PUSH A ;将A的数据压入51H,(51H)=30H
MOV A,B ;B的数据送回A,A=04H
INC A;A=A+1,A=05H
MOVC A,@A+DPTR ;将5+4000H(也就是4005H)的数据送到A,所以A=50H
PUSH A ;将A的数据压入52H,(52H)=50H
RET ;52H、51H的数据d出,成为PC地址
最后结果:A=50H、SP=50H、(51H)=30H、(52H)=50H、PC=3050H
天哪,我也晕了,堆栈是压栈+1还是-1忘记了,堆栈d出是先PCL还是PCH也忘了,你自己再好好看看书吧!总之堆栈你可以理解成一个放空白光盘的盒子,放一张光盘,再放第二张就只能放在第一张上面,拿的时候要先拿第二张,再拿第一张。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)