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
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
第 17 页 共 47 页
LP;MOV A,@R2
ADDC A,@R1 MOV @R3,A DEC R1 DEC R2 DEC R3
DJNE R1,#1FH,LP SJMP $
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 $
第 18 页 共 47 页
RTE
多字节加法子程序:
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
第 19 页 共 47 页
DONE:MOV 30H,A SJMP $
14、编程统计累加器A中“1”的个数。 答:
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:
第 20 页 共 47 页