SJMP $ END 6. 试编写程序,找出片内RAM 30H~5FH单元中无符号数的最大数,并将结果存入60H单元。 答: ORG 0000H MOV R0, #30H MOV R7, #2FH MOV A, @R0 AGAIN: INC R0 MOV B, A CLR C
SUBB A, @R0 JNC L1
MOV A, @R0 AJMP L2 L1: MOV A, B L2: DJNZ R7, AGAIN MOV 60H, A SJMP $ END
7. 从内部RAM 30H单元开始存放了20个数,找出其中的最小数。 答: ORG 0000H MOV R0, #30H MOV R7, #19H MOV A, @R0 AGAIN: INC R0 MOV B,A CLR C
SUBB A, @R0 JC L1
MOV A, @R0 AJMP L2 L1: MOV A, B L2: DJNZ R7, AGAIN MOV 2FH, A SJMP $ END
8. 试编写程序,查找在内部RAM的31H~50H单元中是否有41H这一数据。若有,则将51H
单元置为-1;若未找到,则将51H单元置为0。 答: ORG 0000H MOV R0, #31H MOV R7, #20H MOV A, #41H MOV 51H, #00H AGAIN: MOV B,A
16
CLR C
SUBB A, @R0 JZ L1 INC R0 MOV A, B
DJNZ R7, AGAIN AJMP EXIT L1: MOV 51H, #-1 EXIT: SJMP $ END
9. 编写程序,将片内RAM 40H~6FH单元中的无符号数按照从小到大的次序排列,结果仍然
放在原存储空间。
答: N EQU 30H TAB EQU 40H ORG 0000H SORT: MOV R4, #N-1 LOOP1: MOV A, R4 MOV R3, A MOV R0, #TAB LOOP2: MOV A, @R0 MOV B, A INC R0 CLR C
SUBB A, @R0 JC UNEXCH MOV A, B XCH A, @R0 DEC R0
MOV @R0, A UNEXCH: DJNZ R3, LOOP2 DJNZ R4, LOOP1 SJMP $ END
10.试编写程序,统计片内RAM的20H~5FH单元中出现55H的次数,并将统计结果送60H
单元。
答: TAB EQU 20H ORG 0000H START: MOV 60H, #0 MOV R0, #TAB LOOP2: MOV A, #55H CLR C
SUBB A, @R0 JNZ NEXT INC 60H
17
NEXT: INC R0
CJNE R0, #60H, LOOP2 SJMP $ END
11.编写程序,将片内RAM 30H~7FH单元的内容全部清零。 答: TAB EQU 30H ORG 0000H START: MOV A, #0 MOV R0, #TAB LOOP: MOV @R0, A INC R0
CJNE R0, #80H, LOOP SJMP $ END
12.编写程序,将片外数据存储区中3000H~30FFH单元全部清零。 答: ORG 0000H START: MOV A, #0 MOV R7, #0
MOV DPTR, #3000H LOOP: MOVX @DPTR, A INC DPTR DJNZ R7, LOOP SJMP $ END
13.从内部RAM DATA1单元开始,存放有20H个数据,试编写程序,将这20H个数据逐一移
到片外RAM DATA2单元开始的存储空间。 答: DATA1 EQU 30H
DATA2 EQU 1000H
ORG 0000H
START: MOV R0, #DATA1 MOV DPTR, #DATA2 MOV R7, #20H LOOP: MOV A, @R0 MOVX @DPTR, A INC R0 INC DPTR
DJNZ R7, LOOP SJMP $ END
14. 将外部RAM 8000H开始的20个字节数据传送到外部RAM 8100H开始的地址单元中去。 答: DATA1 EQU 8000H
DATA2 EQU 00H
ORG 0000H
18
START: MOV DPTR, #DATA1 MOV R0, #DATA2 MOV R7, #20 LOOP: MOVX A, @DPTR MOV P2, #81H MOVX @R0, A INC R0 INC DPTR
DJNZ R7, LOOP SJMP $ END
15. 编程统计累加器A中“1”的个数。
答:以下程序将A中“1”的个数放在30H单元。
DAT EQU 37H
ORG 0000H START: PUSH ACC MOV A, #DAT MOV 30H, #0 NEXT: JZ EXIT CLR C RLC A JNC L1 INC 30H L1: AJMP NEXT POP ACC EXIT: SJMP $ END
16. 从内部RAM 30H单元开始,存放有50个数据。试编写程序,将其中的正数、负数分别
送外部RAM 5000H和5500H开始的单元,并分别记下正数和负数的个数送内部RAM 70H和71H单元。
答: BUF EQU 30H
N EQU 50
ORG 0000H START: MOV R0, #BUF MOV R7, #N MOV 70H, #0 MOV 71H, #0 MOV DPTR, #5000H MOV R1, #00H NEXT: MOV A, @R0
JNB ACC.7, POSIT INC 71H
MOV P2, #55H MOVX @R1, A
19
INC R1 AJMP L1 POSIT: INC 70H
MOVX @DPTR, A INC DPTR L1: INC R0
DJNZ R7, NEXT SJMP $ END
17. 利用调子程序的方法,进行两个无符号数相加。请编主程序及子程序。 答: ORG 0000H
START: MOV R6, #56H ;主程序 MOV R7, #7FH ACALL ADD_SUB SJMP $
ADD_SUB: MOV A, R6 ;子程序 ADD A, R7 RET END
18. 计算下面子程序执行的时间(晶振频率为12MHz)。
DL: MOV R3, #15 ;1个机器周期 DL1: MOV R4, #255 ;1个机器周期 DL2: MOV P1, R3 ;2个机器周期
DJNZ R4, DL2 ;2个机器周期 DJNZ R3, DL1 ;2个机器周期 RET ;2个机器周期
答:1个机器周期=1us
延时时间t=1+15×(1+255×(2+2)+2)+2=15348us
19. 编写程序,将30H~34H单元中压缩的BCD码数(每个字节存放两个BCD码数)转换为
ASCII码数,并将结果存放在片内RAM 60H~69H单元。 答: ORG 0000H START: MOV R0, #30H MOV R1, #60H MOV R7, #2 AGAIN: MOV A, @R0 ANL A, #0F0H SWAP A
ADD A, #30H MOV @R1, A MOV A, @R0 ANL A, #0FH ADD A, #30H INC R1 MOV @R1, A INC R0
20