MOV DPTR,#2000H MOV R3, DPH MOV R4, DPL LOOP: MOV A,@R0 ANL A,#0FH MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPH,R3 MOV DPL,R4 MOVX @DPTR,A INC DPTR MOV R3,DPH MOV R4,DPL MOV A,@R0 SWAP A
ANL A,#0FH MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPH,R3 MOV DPL,R4 MOVX @DPTR,A INC DPTR MOV R3,DPH MOV R4,DPL INC R0 DJNZ R2,LOOP SJMP $
TAB: DB ‘0123456789ABCDEF’ END
11、内部RAM 30H和外部RAM 2200H开始的单元分别存放着两个8字节十六进制数(低位字节存放在前),请将二者相加(不考虑溢出情况),并将和存入内部RAM 40H开始的单元中。
解: ORG 0
MOV R0,#30H
MOV R1,#40H MOV DPTR,#2200H MOV R2,#8 CLR C LOOP: MOVX A,@DPTR ADDC A,@R0 MOV @R1,A INC R0 INC R1
第6页 共58页
INC DPTR DJNZ R2,LOOP SJMP $ END
12、请编写多字节无符号数减法程序。被减数存放在内部RAM 30H开始的8个单元中,减数存放在内部RAM 38H开始的8个单元,请将差存放到外部RAM 1000H开始的8个单元中,借位存放到F0标志中。注意:所有数据均按照从低字节到高字节的顺序存放。
解: ORG 0
LJMP START ORG 30H START: MOV R0,#30H MOV R1,#38H MOV DPTR,#1000H MOV R2,#8 CLR C LOOP: MOV A,@R0 SUBB A,@R1 MOVX @DPTR,A INC R0 INC R1 INC DPTR DJNZ R2,LOOP MOV C,F0 SJMP $ END
13、请编写多字节无符号数减法程序。被减数存放在内部RAM 20H开始的16个单元中,减数存放在内部RAM 30H开始的16个单元,请将差存放到外部RAM 2000H开始的16个单元中,借位存放到OV标志中。注意:所有数据均按照从低字节到高字节的顺序存放。
解: ADDR1 EQU 20H ADDR2 EQU 30H LEN EQU 16 ADDR3 EQU 2000H ORG 0 LJMP START ORG 30H
START: MOV R0,#ADDR1 MOV R1,#ADDR2 MOV DPTR,#ADDR3 MOV R2,#LEN CLR C LOOP: MOV A,@R0 SUBB A,@R1
第7页 共58页
MOVX @DPTR,A INC R0 INC R1 INC DPTR DJNZ R2,LOOP MOV OV,C SJMP $ END
14、将存放在内部RAM 20H-3FH单元的压缩BCD码转换成ASCII码,依次存放到外部RAM 2300H开始的单元中。(注:每个单元均先转换高四位) 解: LEN EQU 20H ADDR1 EQU 20H ADDR2 EQU 2300H ORG 0 LJMP START ORG 30H
START: MOV R0,#ADDR1 MOV DPTR,#ADDR2 MOV R2,#LEN LOOP: MOV A,@R0 ANL A,#0F0H SWAP A
ORL A,#30H (或 ADD A,#30H) MOVX @DPTR,A INC DPTR MOV A,@R0 ANL A,#0FH
ORL A,#30H (或 ADD A,#30H) MOVX @DPTR,A INC DPTR INC R0
DJNZ R2,LOOP SJMP $ END
评分办法:程序设计思路正确可得5分,指令完全写对可得10分。不要求使用伪指令。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
15、将存放在内部RAM 30H-35H单元的十六进制数转换成相应的ASCII码,依次存放到外部RAM 1100H开始的单元区中。(注:每个字节转换时先转换高四位)
第8页 共58页
解: ORG 0
MOV R0,#30H MOV DPTR,#1100H MOV R2,#6
LOOP: MOV A,@R0 ; 取需要转换的数 ANL A,#0F0H ; 屏蔽低4位 SWAP A PUSH DPH
PUSH DPL ; 保护目的地址 MOV DPTR,#TAB
MOVC A,@A+DPTR ; 查表得ASCII码 POP DPL
POP DPH ; 恢复目的地址
MOVX @DPTR,A ; 存转换后的ASCII码 INC DPTR ; 修改目的地址指针 MOV A,@R0 ; 取需要转换的数 ANL A,#0FH ; 屏蔽高4位 PUSH DPH
PUSH DPL ; 保护目的地址 MOV DPTR,#TAB
MOVC A,@A+DPTR ; 查表得ASCII码 POP DPL
POP DPH ; 恢复目的地址 MOVX @DPTR,A
INC DPTR ; 修改目的地址指针 INC R0 ; 修改源地址指针 DJNZ R2,LOOP ; 未转换完则继续 SJMP $ TAB : DB ‘0123456789ABCDEF’ END
评分办法:程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
16、内部RAM 30H开始的单元中存放着16个0-9的ASCII码(高位字节在前),请将其转换为压缩BCD码(高位在前)并存入外部RAM 1000H开始的单元中。
第9页 共58页
解: ORG 0
MOV R0,#30H MOV DPTR,#1000H
MOV R2,#8 ; 16个ASCII码转换为8个压缩BCD码 LOOP: MOV A,@R0
ANL A,#0FH ; 屏蔽高4位得到BCD码 SWAP A MOV R1,A
INC R0 ; 指向下一个ASCII码 MOV A,@R0
ANL A,#0FH ; 屏蔽高4位得到BCD码 ORL A,R1 ; 合成压缩BCD码 MOVX @DPTR,A ; 存压缩BCD码 INC DPTR INC R0
DJNZ R2,LOOP SJMP $ END
17、设有两个长度为16字节的数组,分别存放在外部RAM 0200H和0300H为首址的存储区域中,试编写程序求其对应项之和(不考虑溢出的情况),结果存放在以0400H为首址的外部RAM中。
解: 参考程序清单如下: ORG 0
MOV R2,#16 ; 数组长度为16个字节 MOV R3,#02H ; 数组1的首地址高8位 MOV R4,#03H ; 数组2的首地址高8位 MOV R5,#04H ; 和数组的首地址高8位 MOV DPL,#0 ; 数据指针低8位清零 LOOP: MOV DPH,R3
MOVX A,@DPTR ; 取被加数 MOV R1,A ; 存被加数 MOV DPH,R4
MOVX A,@DPTR ; 取加数 ADD A,R1 ; 求和 MOV DPH,R5
MOVX @DPTR,A ; 存和
INC DPL ; 指向下一字节 DJNZ R2,LOOP ; 未加完则循环 END
评分办法:程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。
18、编程求内部RAM中40H~4FH共16个单元中的内容的和(结果为2字节),并将和放入50H和51H单元中(高8位在50H)。
第10页 共58页