查表指令中計(jì)算偏移量的簡(jiǎn)便方法
對(duì)于復(fù)雜的計(jì)算,單片機(jī)的速度顯得偏慢。
最好的辦法是人工事先算出全部的結(jié)果,依次存放在ROM中,需要計(jì)算時(shí),直接從ROM中查出結(jié)果即可。
查表有兩條指令:
MOVC A, @A + PC
MOVC A, @A + DPTR
前者不使用DPTR,節(jié)省資源,但是其中有個(gè)“偏移量”頗為難算,它涉及到指令機(jī)器碼的字節(jié)數(shù),通常是編譯一遍之后,由人工來(lái)數(shù),“偏移量”究竟是應(yīng)該多少,經(jīng)常有錯(cuò)誤出現(xiàn),且不便于修改程序。
做而論道有一個(gè)利用編譯系統(tǒng)自動(dòng)計(jì)算偏移量的方法,下面給出一個(gè)例子。
;================================================================
要求利用MOVC A, @A + PC指令,編寫(xiě)一查平方表程序,將片內(nèi)30H ~ 39H內(nèi)的數(shù)查出平方值,然后送入40H ~ 49H單元。
應(yīng)該預(yù)先在30H ~ 39H存入數(shù)據(jù)為 1,3,5,7,9,2,4,6,8,10。
;-----------------------------------------------------------------------
程序如下:
org 0000h
mov 30h, #1 ;先存放預(yù)置數(shù)據(jù)
mov 31h, #3
mov 32h, #5
mov 33h, #7
mov 34h, #9
mov 35h, #2
mov 36h, #4
mov 37h, #6
mov 38h, #8
mov 39h, #10
call SQRT ;調(diào)用子程序
sjmp $
;-----------------------------------------------------------------------
;查表法求平方的程序如下。
SQRT:
MOV R0, #30H ;數(shù)據(jù)源地址
MOV R1, #40H ;數(shù)據(jù)目的地址
MOV R2, #10 ;共有10個(gè)數(shù)
LOOP:
MOV A, @R0
ADD A, #S_TAB - CHA ;自動(dòng)計(jì)算“偏移量”
MOVC A, @A + PC
CHA:
MOV @R1, A
INC R0
INC R1
DJNZ R2, LOOP
RET
S_TAB:
DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196
;================================================================
;完