因为没有16位加法指令,DPTR要分为高低两个8位来相加。程序中用R2存查表项的列号,R3存查表项得行号。程序如下:
TERM EQU 10 ;被统计课程代号 NUM EQU 50 COURDE EQU 15
MOV R2,#TERM ;R2存列号 CLR A
MOV R3,A ;R3存行号 MOV R4,A ;总成绩先为0 MOV R5,A
MOV R6, #NUM ;循环NUM次
LOOP: ACALL PICK ;调用查表子程序 CLR C
ADD A,R4 ;累加成绩低位 DA A MOV R4,A CLR A
ADDC A,R5 ;累加成绩高位 DA A MOV R5,A
INC R3 ;到下一行再查表
DJNZ R6,LOOP
SJMP $
PICK: MOV DPTR,#TAB ;表格首地址 MOV A,R3 MOV B,#COURSE MUL AB ADD A,DPL MOV DPL,A MOV A,B ADDC A,DPH MOV DPH
MOV A,R2 ;再加上列号 MOVC A,@A+DPTR ;查表 RET
3-30 编写16位无符号数除以8位无符号数的除法程序。被除数存于R1R0中,R1为高8位,除数存于R2中。运算后,商存于R0中,余数存于R1中。除数为0则置OVER单元为1。
解:按照题意,商为8位,故只需执行8次循环比较,也意味着被除数的高8位一定小于除数。然后就可以按照“左移相减”方法来进行比较。即将被除数左移一位以后,取出高9位来与除数相减(比较),若够减则商为1,并将差值(余数)代替被除数高8位。若不够减则商为0,被除数高8位不修改。然后左移一位进行下一次比较,直到得到8位商为止。程序如下:
OVER DATA 20H
MOV OVER,#00H ;复位溢出标志 MOV A,R2 ;取除数
JNZ START ;除数不为0则开始 MOV OVER,#01H ;置位溢出标志 SJMP $ ;结束 START:MOV R3,#08H ;8次循环 LOOP: CLR C
MOV A,R0 ;被除数低8位 RLC A MOV R0,A
MOV A,R1 ;被除数高8位
RLC A MOV R1 MOV F0 CLR C SUBB A JNC NEXT ; JNB F0NEXT1: MOV R1 INC R0NEXT: DJNZ R3 SJMP $ END
,A ,C
,R2 ;,NEXT
,A ;
,LOOP ; 与除数比较 大于等于除数转移 余数送回 不够8次,返回