INC R0 ;字节数加1
CJNE R0,#00H,LOOP ;连续清256个字节 LOOP1: SJMP LOOP1 END
7、录入并调试一个排序子程序,其功能为用冒泡法将内部RAM中从50H开始的十个单字节无符号正整数,按从小到大的次序重新排列。 程序如下:
用冒泡法进行数据排序 ORG 0000H MOV R3,#50H LOOP0: MOV A,R3
MOV R0,A ;指针送R0 MOV R7,#0AH ;长度送R7
CLR 00H ;标志位为0 MOV A,@R0 LOOP1: INC R0 MOV R2,A CLR C
MOV 22H,@R0
CJNE A,22H,LOOP2 ;相等吗? SETB C
LOOP2: MOV A,R2
JC LOOP3 ;小于或等于不交换 SETB 00H XCH A,@R0 DEC R0 XCH A,@R0
INC R0 ;大于交换位置 LOOP3:MOV A,@R0 DJNZ R7,LOOP1
第 页 共 46 页
16
JB 00H,LOOP0 LOOP: SJMP LOOP END
;一次循环中有交换继续 ;无交换退出
8、设被加数存放在内部RAM的20H、21H单元,加数存放在22H、23H单元,若要求和存放在24H、25H中,试编写出16位数相加的程序。 答: ORG 1000H MOV R1,#21H
MOV R2,#23H
MOV R3,#25H CLR C
LP;MOV A,@R2
ADDC A,@R1 MOV @R3,A DEC R1 DEC R2 DEC R3
DJNE R1,#1FH,LP SJMP $
第 页 共 46 页
17
9、编写一段程序,把外部RAM中1000H~1030H单元的内容传送到内部RAM的30H~60H单元中。
答: ORG 0030H MOV R1,#49 MOV R0,#30H MOV DPTR,#1000H LOOP: MOVX A,@DPTR MOV @R0,A INC DPTR INC R0
DJNZ R1,LOOP SJMP $ END
10、编写程序,实现双字节无符号数加法运算,要求(R1R0)+(R7R6)→(61H60H)。 答:
MOV A,R0 ADD A,R6 MOV 60H,A MOV A,R1 ADDC A,R7 MOV 61H,A SJMP $
11、用R0和R1作数据指针,R0指向第一个加数,并兼作“和”的指针,R1指向另一个加
数,字节存放到R2中作计数初值。 答:
主程序:
JAFA: MOV R0,#20H ;指向加数最低字节 MOV R1,#29H ;指向另一加数最低字节 MOV R2,#04H ;字节数作计数值 ACALL JASUB ;调用加法子程序 AJMP $ RTE
多字节加法子程序:
第 页 共 46 页 18
JASUB: CLR C
JASUB1: MOV A,@R0 ;取出加数的一个字节(4B无符号数加数) ADDC A,@R1 ;加上另一数的一个字节 MOV @R0,A ;保存和数 INC R0 ;指向加数的高位 INC R1 ;指向另一加数的高位 DJNZ R2,JASUB1 ;全部加完了吗? RET
12、在内部RAM的21H单元开始存有一组单字节不带符号数,数据长度为30H,要求找出最大数存入BIG单元。 答:
START: MOV R7,30H DEC R7
MOV R0,#21H
MOV A,@R0
LOOP:INC R0 CLR C
SUBB A,@R0 JNC NEXT MOV A,@R0 NEXT:DJNZ R7,LOOP MOV BIG, A SJMP $ END
13、求双字节补码程序
设双字节数放在内部RAM的30H和31H单元(高字节在低地址),将其取补后存入40H(存放高字节)和41H(存放低字节)单元 答:
START:MOV A,31H CPL A
ADD A,#01H MOV 41H,A MOV A,30H CPL A JNC DONE ADD A,#01H
DONE:MOV 30H,A SJMP $
14、编程统计累加器A中“1”的个数。
第 页 共 46 页
19
答:
MOV R1,#0 PUSH ACC LOOP1:JZ DONE CLR C RLC A JNC LOOP1 INC R1 SJMP LOOP1 DONE:POP ACC SJMP $ END
15、编程序实现1+2+3+??+100=? 答:
汇编代码如下:
H_Byte EQU R4 ;保存结果,高8位L_Byte EQU R5 ;保存结果,低8位Max_Adder EQU 100 ;最大的加数
ORG 0000H LJMP MAIN ORG 0030H
MAIN:
MOV R2,#1 ;加数 MOV R4,#0 MOV R5,#0
START:
MOV A,#Max_Adder CLR CY SUBB A,R2 JC RESULT MOV A,R2 ADD A,L_Byte
MOV L_Byte,A ;保存低位 MOV A,H_Byte ADDC A,#0
MOV H_Byte,A ;保存高位 INC R2 JMP START
RESULT:
SJMP $ ;只用于调试 END
C语言代码如下:
第 页 共 46 页
20