ORG 00H
MOV R2,#0AH ;--打算从TAB3表中,查出第十个字,即:6758H
TB3: MOV A,R2
ADD A,R2 ;--A乘以2,因为,各个字,地址相差为2
MOV R3,A ;--暂存
ADD A,#6 ;--加上偏移量
MOVC A,@A+PC ;--查出第一字节,67H
XCH A,R3 ;--执行上一条查表时,PC,为此处的地址
;-------此处,和TAB3,相差6字节,故此,在前面加上了6
ADD A,#3 ; --再加一个偏移量
MOVC A,@A+PC ;--查出第二字节,58H
MOV R4,A ;--执行上一条查表时,PC,为此处的地址
;-------此处,和TAB3,相差2字节,又因为查第二字节,故此,在前面加上了3
RET
TAB3:DW 1520,3721,42645,7580
DW 3483,32657,883,9943
DW 10000,40511,6758H,8931
DW 4468,5871,13284,27808
END
计算偏移量,要用每条指令的字节数来计算。
先要写出机器码,才行。
记住两点你就明白了:1、CPU执行程序时,PC指向下一条指令的首地址;
2、查表时候,PC是查表的下一条指令的首地址,只要能将其地址修正到表中对应位置就可以了。所以修正值与查表位置和表的位置有关。
跟指令字节数有关
很难看懂这个,查表用movc a,@a+dptr是最直接和有效的方法,何必费力用PC呢。而且这个程序显然有问题,不知所云。第一个是加的26不是16,所以第二个加的是23,。
ADD A,#6 ;这里应该加10,因为之后的指令占用10个字节
MOVC A,@A+PC
XCH A,R3
ADD A,#3 ;这好理解因为后面一个MOVC之后的两句占用3个字节
MOVC A,@A+PC
MOV R4,A
RET