;已知程序执行前有A=02H,SP=52H,(51H)=FFH,(52H)=aaH.
ORG 0000H
MOV A, #02H
MOV 51H, #0xFF
MOV 52H, #0xaa
MOV SP, #52H
POP DPH ;SP=51H
POP DPL ;SP=50H
mov dpl, #0xfe
mov dph, #0x21
inc dptr
inc dptr
;POP SP ;sp 会置为 0
MOV DPTR, #4000H ;DPTR=#4000H
RL A ;A=04H(02H*2)
MOV B,A ;B=04H
MOVC A,@A+DPTR ;查表A=30H ;//这里怎么得出A=30H?
PUSH ACC ;SP=51H,(51H)=#30H这里为什么SP=51H?然后(51H)=#30H又是怎么得出的?
MOV A,B ;A=04H
INC A ;A=05H
MOVC A,@A+DPTR ;查表A=50H
PUSH ACC ;SP=52H,(52H)=#50H
RET
ORG 4000H
DB 10H,80H,30H,50H,30H,50H
end
;这就是个查表并把查得数据进行压栈的程序。
ORG 4000H是定义的伪指令,定义了存放表中数据的首地址在4000H,由于数据类型是DB即只占用了一个字节,所以储存单元及其内容是4000H存放数据10H,4001H存放80H……4004H存放30H,4005H存放50H。该伪指令使得编译时地址分配按照以上实现。起初两次弹栈后SP=50H,50H是指堆栈地址。
第一次MOVC A,@A+DPTR,MOVC是个查表指令,它实现把A+DPTR地址所指的数据查找到并赋给累加器A,由于A=04H,此时A+DPTR=4004H,对应数据30H。
PUSH ACC则把累加器A中的数据进行压栈,由于SP=50H,故30H被存在压栈寄存器50H所指地址上,即(50H)=30H。该指令执行完后,SP会自动+1,改为指向地址51H。