查表指令中计算偏移量的简便方法

对于复杂的计算,单片机的速度显得偏慢。
最好的办法是人工事先算出全部的结果,依次存放在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
;================================================================
;完

你可能感兴趣的:(非同一般)