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
LOOP:
MOV A, @R0
ADD A, #S_TAB - ($ + 4)
MOVC A, @A + PC
MOV @R1, A
INC R0
INC R1
DJNZ R2, LOOP
RET
S_TAB:
DB 1, 4, 9, 16, 25, 36, 49, 64, 81, 100
完
LTB2:-------------------下面是R2R3乘以2
MOV A, R3
CLR C
RLC A
MOV R3, A
XCH A, R2
RLC A
XCH R2, A
------------------下面是表首地址加上R2R3
MOV DPTR, #TAB2
ADD A, DPL (R2R3)+(DPTR)→(DPTR)
MOV DPL, A
MOV A, DPH
ADDC A, R2
MOV DPH, A
------------------下面是查表,查出两个字节
CLR A
MOVC A, @A + DPTR
MOV R2,A
CLR A
INC DPTR
MOVC A, @A + DPTR
MOV R3,A
RET
----
这个程序,是根据两个字节的数据来查表,查出的,也是两个字节。
如果先弄懂了一个字节的查表程序,看这个程序,也就没有什么难的了。
16和7是查表指令时的PC与数据表格之间的字节数MOV A ,@R0 取R0指向的地址中的数据到A
ANL A,#0FH ;高四位清零
ADD A,#16 ;加16
MOVC A, @A+PC ;查表,表的首地址为绝对地址PC+A
MOVC A,@A+PC就需要1个字节啊
查表指令距离表首地址的长度是字节数
用DPTR的汇编程序:
ORG 0100H
MOV 30H,#12H
MOV 31H,#34H
MOV 32H,#56H
MOV 33H,#78H
LCALL SUBRTE
ORG 1000H
SUBRTE: MOV R0,#30H ;置地址指针R0初值
MOV R1,#40H ;置地址指针R1初值
MOV R2,#4 ;置字节数
LOOP:MOV A,@R0 ;取16进制数
ANL A,#0FH ;屏蔽高4位
MOV DPTR,#TABLE ;
MOVC A,@A+DPTR;查表低4位转换为ASCⅡ码
MOV @R1,A ;送结果
INC R1;修改指针
MOV A,@R0;从新取16进制数
SWAP A;高4位与低4位互换
ANL A,#0FH ;取高4位
ADD A,#7
MOVC A,@A+PC ;查表高4位转换为ASCⅡ码
MOV @R1,A
INC R0
INC R1
DJNZ R2,LOOP
DEC R1
RET
TABLE: DB '012345678'
DB '9ABCDEF'
END
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)