习题与思考题
3-8 按要求写出相应的指令。
(1)把寄存器 R6 的内容送到累加器 A 中。 (2)把外部 RAM 1000H 单元的内容传送到内部 (3)清除内部 RAM 3FH 单元的高 4 位。 (4)使累加器 A 的最低位置 1。 (5)清除进位位。
(6)使 ACC.4 和 ACC.5 置 1。
(7)把外部 ROM 2000H 单元中的内容送到内部 (8)把外部 ROM 2000H 单元中的内容送到外部 答案:
1) MOV A,R6 2)
MOV DPTR,#1000H MOVX A,@DPTR
MOV
R0,#30H
MOV
@R0,A 3) ANL 3FH,#0FH 4) ORL A,#01H
5) CLR C
6) ORL
A,#30H 7)
CLR A
MOV DPTR,#2000H
MOVC
A,@A+DPTR
MOV
20H,A
8)
CLR A
MOV DPTR,#2000H
MOVC
A,@A+DPTR
MOV
DPTR,#3000H
MOVX
@DPTR,A
3-10 编写程序段完成如下要求。
(1)将寄存器 R0 中的内容乘以 10(积小于 256)。
(2)将片内 RAM 30H 单元开始的 15 个字节的数据传送到片外 RAM 3000H 开始的单元中。
(3)将片外 RAM 2000H 开始的 5 个字节的数据传送到片内 RAM 20H 开
RAM 30H 单元中。
RAM 的 20H 单元中。 RAM 的 3000H 单元中。
始的单元中。
(4)有 10 个字节的二进制数存放在片内 RAM 以 40H 开始的单元内, 编程找出其中的最大值并存于内部 50H 单元中。
(5)将片外 RAM 空间 2000H~200AH 中的数据的高 4位变零,低 4位不 变,原址存放。
6)将外部 RAM 2040H 单元的内容与 3040H 单元的内容互换。 答案:
MOVX @DPRT,A INC R0 INC DPTR
DJNZ R7,LOOP SJMP $ END
(3) MOV DPTR,#2000H
MOV R0,#20H MOV R7,#05H
LOOP: MOVX A,@DPTR MOV @R0,A INC R0
INC DPTR DJNZ R7,LOOP END
(4) ORG 0000H
MOV A,40H;A 寄存器放最大值,且初始化最大值(默认第一个数)
MOV R3,#09H ;比较次数 MOV R0,#41H
START: CJNE A,@R0,LOOP
LOOP: JNC LOOP1 ;如果比 A 小,则跳转到 LOOP1
MOV A,@R0 ;如果比 A 大,则更新 A 的值
(1) MOV MOV MUL MOV
(2) ORG MOV MOV MOV LOOP: MOV
B,#0AH
A,R0 AB
R0,A
0000H
R0,#30H
DPTR,#3000H R7,#0FH
A,@R0
LOOP1: INC R0
DJNZ R1,LOOP SJMP $
(6) MOV DPTR,#2040H MOVX A,@DPTR MOV R0,#20H MOV @R0,A MOV
DPTR,#3040H MOVX A,@DPTR XCH @R0,A MOVX @DPTR A MOV A,@R0 MOV DPTR,#2040H MOVX @DPTR,A 3-15 设有一带符号的十六位数以补码形式存放在 R2、R3 寄存器中,试
编制求其原码的程序。
ORG 0000H
START: MOV A,R3
JB ACC.7,NEXT ;判读符号位,如果是正数则原码与补码一样,如果为 负,求原码
的方法是符号位不变,其余位取反加 1
MOV R3,A
HERE: SJMP $
NEXT: XRL A,#7FH ;高八位,符号位不变,其余取反
MOV R3,A ;放回 R3 MOV A,R2 ;低八位 XRL A,#0FFH ;取反 ADD A,#01H ;加 1 MOV R2,A ;放回 R2
DJNZ MOV SJMP END
(5) MOV MOV LOOP: MOVX ANL MOVX INC R3 START 50H,A $ DPTR,#20000H
R1,#0BH
A,@DPTR
A,#0FH
@DPTR,A DPTR
MOV A,R3 ;看低八位是否有向高八位进位 ADDC A,#00H MOV R3,A SJMP $ END
3-16 设有一不带符号的十六进制数组,存放在 8031 单片机片内 RAM 以 BUFFER 为首址的连续单元中, 其长度为 30 个字节, 要求统计小于 10 ,等
于10及大于10的数的个数,并把它们分别存放到片内 RAM 的LESS 、EQUAL 、 BIG 单元中,试编制实现上述要求的程序并画出相应的流程图。
2000H~2004H 单元(以压缩 BCD 码存放)。
ORG 0000H MOV R2,#05H
MOV DPTR,#1000H
MOV R0,#20H
MOVX A,@DPTR
LOOP: BUFFER DATA 10H LESS DATA 30H
EQUAL DATA 31H
BIG
DATA 32H MOV R0,#BUFFER
MOV R7,#1EH
MOV LESS,#00H
MOV
EQUAL,#00H
MOV
BIG,#00H
NEXT: CJNE
@R0,#0AH, LOOP1; 循环次数
INC EQUAL
AJMP LOOP3
LOOP1: JC LOOP2
INC BIG
AJMP LOOP3
LOOP2: INC LESS LOOP3:
INC
R0
DJNZ
R7, NEXT
SJMP
$
END
3-17 在外部 RAM 1000H 单元开始
BCD 10个用 ASCII 码
码,然后存放在
ORG 0000H 表示的 0~9 之间的数字,请编程将它们转换成
ANL A,#0FH
MOV R4,A
INC DPTR
MOVX A,@DPTR
ANL A,#0FH
SWAP A
ADD A,R4
MOV @R0,A
INC R0
INC DPTR
DJNZ R2,LOOP
MOV R5,#05H
MOV R0,#20H
MOV DPTR,#2000H
LOOP1: MOV A,@R0
MOVX @DPTR,A
INC R0
INC DPTR
DJNZ R5,LOOP1
SJMP $
END
3-18 设有50 个无符号8 位二进制数,存放在8031 单片机内部RAM 以BOFER 为首址的连续单元中,试编制将其中最小数存放到内部RAM 的MIN 单元的程序并画出相应的流程图。
ORG 0000H
BOFER DATA 20H
MIN DATA 60H
MOV R2,#31H ;循环49 次
MOV R1,# BOFER+1
MOV MIN,BOFER ;把最小值放A,且初始化时把第一个数放入 A LOOP: CJNE @R1,MIN,LOOP1
LOOP1: JNC LOOP2 ; @R1>MIN
MOV MIN,@R1 ; MIN >@R1 ,MIN 要更新
LOOP2: INC R1
DJNZ R2,LOOP
SJMP $
END
3-19 设有一字符串存放在8031 单片机内部RAM 以20H 为首址的连续