查表指令中计算偏移量的简便方法
扫描二维码
随时随地手机看文章
对于复杂的计算,单片机的速度显得偏慢。
最好的办法是人工事先算出全部的结果,依次存放在ROM中,需要计算时,直接从ROM中查出结果即可。
查表有两条指令:
MOVC A, @A + PC
MOVC A, @A + DPTR
前者不使用DPTR,节省资源,但是其中有个“偏移量”颇为难算,它涉及到指令机器码的字节数,通常是编译一遍之后,由人工来数,“偏移量”究竟是应该多少,经常有错误出现,且不便于修改程序。
做而论道有一个利用编译系统自动计算偏移量的方法,下面给出一个例子。
;================================================================
要求利用MOVC A, @A + PC指令,编写一查平方表程序,将片内30H ~ 39H内的数查出平方值,然后送入40H ~ 49H单元。
应该预先在30H ~ 39H存入数据为 1,3,5,7,9,2,4,6,8,10。
;-----------------------------------------------------------------------
程序如下:
org 0000h
mov 30h, #1 ;先存放预置数据
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 ;调用子程序
sjmp $
;-----------------------------------------------------------------------
;查表法求平方的程序如下。
SQRT:
MOV R0, #30H ;数据源地址
MOV R1, #40H ;数据目的地址
MOV R2, #10 ;共有10个数
LOOP:
MOV A, @R0
ADD A, #S_TAB - CHA ;自动计算“偏移量”
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
;================================================================
;完