【例3.1】 在程序存儲(chǔ)器中從而2000H單元開始依次存放置0~9的平方值:0、1、4、9、…、81,要求依據(jù)累加器A中的值(0~9)來(lái)查找所對(duì)應(yīng)的平方值,分析下述程序的結(jié)果。
MOV DPTR,#2000H
MOV A,#09H
MOVC A,@A+DPTR
執(zhí)行結(jié)果:(DPTR)=2000H,(A)=51H。
【例3.2】 仍以上例程序存儲(chǔ)器中2000H單元開始存放0~9的平方值,以PC作為基址寄存器進(jìn)行查表,設(shè)MOVC指令所在地址(PC)=1FF0F。
解:偏移量=2000H—(1FF0H+1)=0FH
相應(yīng)的程序如下:
MOV A,#09H
ADD A,#0FH
MOVC A,@A+PC
執(zhí)行結(jié)果:(PC)=1FF1H,(A)=51H
這是以PC作為基址寄存器,CPU取完該指令操作碼時(shí)PC會(huì)自動(dòng)加工廠,指向下一條指令的第一個(gè)字節(jié)地址,即此時(shí)是用(PC)+1作為基址的,目標(biāo)地址為(A)+(PC)+1。另外,由于累加器A中的內(nèi)容為8位無(wú)符號(hào)整數(shù),這不使得本指令查表范圍只能在以PC當(dāng)前值開始后256個(gè)字節(jié)范圍內(nèi)(即(PC)+1H~100H),使表格地址空間分配受到限制。同時(shí)編程時(shí)還需進(jìn)行偏移量的計(jì)算,即MOVC A,@A+PC指令所在地址與表格存放首地址間的距離量計(jì)算,并需要一條加法指令A(yù)DD進(jìn)行地址調(diào)整(ADD指令將在下節(jié)介紹)。偏移量計(jì)算公式為:
偏移量=表首地址—(MOVC指令所在地址+1)
【例3.3】 若在程序存儲(chǔ)器中2000H單元開始依次存放0~9的平方值,數(shù)據(jù)指針(DPTR)=3A00H,用查一指令取出2003H單元的數(shù)據(jù)后,要求保持DPTR中的內(nèi)容不變,完成以上功能的程序如下:
MOV A,#03H ;(A)←03H
PUSH DPH ;保護(hù)DPTR高8位入棧
PUSH DPL ;保護(hù)DPTR低8位入棧
MOV DPTR,#2000H ;(DPTR)←2000H
MOVC A,@A+DPTR ;(A)←(2000H+03H)
POP DPL ;彈出DPTR低8位
POP DPH ;彈出DPTR高8位,(先進(jìn)后出)
執(zhí)行結(jié)果:(A)=09H,(DPTR)=3A00H。
由此可見,雖然在程序中改變了DPTR的內(nèi)容,但利用PUSH和POP指令可對(duì)其進(jìn)行保護(hù)和恢復(fù),要注意的是堆棧先進(jìn)后出的原則,否則DPH彈出時(shí)互換。
