3-3 访问外部数据存储器和程序存储器可以用哪些指令来实现?举例说明。 答:访问外部数据存
储器可以用以下指令实现:
解:MOVX A, @Ri ;((Ri))→A,寄存器Ri指向的片外RAM地址中的内容送到累加器A中 MOVX @Ri, A ;A→((Ri)),累加器中内容送到寄存器Ri指向的片外RAM地址中
MOVX A, @DPTR ;((DPTR))→A,数据指针指向的片外RAM地址中的内容送到累加器A中 MOVX @DPTR, A ;A→((DPTR)),累加器中内容送到数据指针指向的片外RAM地 址中 访问程序存储器可以用以下指令实现:
MOVC A, @A+DPTR ;((A+DPTR))→A,表格地址单元中的内容送到累加器A中
MOVC A, @A+PC ;PC+1→PC,((A+PC))→A,表格地址单元中的内容送到累加器A中 (2) 寄存器寻址方式;(3) 寄存器间接寻址方式 答(1)立即寻址方式: MOV 30H, #0FH (2)寄存器寻址方式: MOV R5, #0FH
MOV 30H, R5
(3)寄存器间接寻址方式:MOV @R1, #0FH
3-4 试用下列3种寻址方式编程,将立即数0FH送入内部RAM的30H单元中。 (1) 立即寻址方式;
3-7 写出实现下列要求的指令或程序片段。 (1) 将R0的内容传送到R1;
(2) 内部RAM的20H单元内容传送到寄存器R1;
(3) 内部RAM的20H单元的D7和D3位清零,其它位保持不变; (4) 外部RAM的1000H单元内容传送到内部RAM的60H单元中; (5) 外部RAM的1000H单元内容传送到寄存器R2; (6) 清除累加器高4位。 答:(1)MOV A, R0
MOV R1, A (2)MOV R1, 20H (3)MOV A, 20H
ANL A, #77H
(4)MOV DPTR, #1000H
MOVX A, @DPTR MOV 60H, A
(5)MOV DPTR, #1000H
MOVX A, @DPTR MOV R2, A (6)ANL A, #0FH
3-8 试编写一段程序,将内部数据存储器30H、3lH单元内容传送到外部数据存储器1000H、1001H
单元中。 答: MOV A, 30H
MOV DPTR, #1000H MOV @DPTR, A MOV A, 31H
MOV DPTR, #1000H MOV @DPTR, A
3-9 试编写一段程序,将外部数据存储器40H单元中的内容传送到0l00H单元中。
答: MOV DPTR, #0040H
MOV A, @DPTR MOV 0100H, A
3-10 试编写—段程序,将R3中的数乘4(用移位指令)。
答: MOV A, R3
MOV 23H, #02H L0: DJNZ 23H, L1 L1: RL A
SJMP L0
3-11 试编写—段程序,将R2中的各位倒序排列后送入R3中。
答: MOV A, R2
MOV 23H, #08H L0: DJNZ 23H, L1 L1: RL A SJMP L0 MOV R3, A
3-12 试编写—段程序,将P1口的高5位置位,低3位不变。
答: MOV A, P1 ORL A, #F8H MOV P1, A
4-4 编写程序,将片内30H~39H单元中的内容送到以2000H为首的外部存储器。 答: ORG 0000H
START: MOV R0, #30H
MOV DPTR, #2000H MOV R1, #10 CLR A
LOOP: MOV A, @R0
MOVX @DPTR, A DEC R1
DJNZ R1, LOOP END
4-5 编写程序,采用算术平均值滤波法求采样平均值,设8次采样值依次放在20H~27H的连续单元中,结果保留在A中。 答:FILT: CLR A
MOV R2, A MOV R3, A MOV R0, #20H MOV R7, #08H ;初始化
FILT1: MOV A, @R0
ADD A, R3 MOV R3, A CLR A
ADDC A, R2 MOV R2, A INC R0
DJNZ R7, FILT1
;累加采样值到R3,累加进位到R2=00000xxxB FILT2: SWAP A
RL A ;R2/8,节省一个指令周期 XCH A, R3 SWAP A
RL A ;R3/8,节省一个指令周期 ADD A, #80H ;四舍五入
ANL A, #1FH ;屏蔽移位进入的前三位 ADDC A, R3 ;结果相加 END
;取平均值
4-6 编写程序,将存放在内部RAM起始地址为20H和30H的两个3字节无符号相减,结果存放在内部RAM单元70H、71H、72H中(低位对应低字节)。 答: ORG 0000H
START: MOV R0, #20H
MOV R1, #30H MOV R2, #03H CLR C S0: LCALL XU
MOV 70H, A LCALL XU MOV 70H, A LCALL XU MOV 70H, A S1: MOV A, @R0
SUBB A, @R1 INC R0 INC R1 RET END
4-7 编写程序,实现两个双字节无符号数的乘法运算,乘数存放在R2和R3中(R2存放高字节,R3存放低字节,以下类同),被乘数存放在R6和R7中,积存放在R4、R5、R6和R7中。 答: ORG 0000H DMUL: MOV A, R3
MOV B, R7 MUL AB MOV R0, A MOV R1, B ;低8位*低8位
MOV A, R2 MOV B, R7 MUL AB ADD A, R1 MOV R1, A MOV A, B
ADDC A, #00H MOV R5, A ;高8位*低8位
MOV A, R3 MOV B, R6 MUL AB ADD A, R1 MOV R1, A MOV A, R5 ADDC A, B MOV R5, A MOV A, #00H ADDC A, #00H MOV R4, A ;低8位*高8位
MOV A, R3 MOV B, R6 MUL AB ADD A, R5 MOV R5, A MOV A, R4 ADDC A, B MOV R4, A ;高8位*高8位
MOV A, R0 MOV R7, A MOV A, R1 MOV R6, A ;R0、R1给R7、R6
END
4-8 假设在R0指向的片内RAM区,存有20个16进制数的ASCII字串。将ASCII码转换为16进制数,然后两两合成一个字节,从低地址单元到高地址单元依次组合。 答: ORG 0000H
START: MOV R7, #20 S0: MOV A, R0
MOV R1, A ;R1为中间量 MOV A, @R0 CLR C
SUBB A, #30H MOV @R1, A JC S01
MOV A, @R0 SUBB A, #07H MOV @R1, A S01: INC R0
MOV A, @R0 CLR C
SUBB A, #30H SWAP A ORL A, @R1 MOV @R1, A JC S02
MOV A, @R0 SUBB A, #07H SWAP A OR A, @R1 MOV @R1, A S02: INC R0
DJNZ R7, S0 END
4-9 结合例4-24和图4-5编写线性标度变换程序。
答: 将256近似255,256比255做浮点运算简单很多
PUSH ACC PUSH PSW MOV A, #Am MOV 20H, #A0 CLR C
SUBB A, 20H ;将256近似255,则A为小数点后的位 MOV 21H, #Nx MOV B, 21H
MUL AB ;B为整数位,A为小数点后的位 ADD A, #80H ;四舍五入 MOV A, B ADDC A, #A0 MOV 38H, A POP PSW PUSH ACC RET
5-4 试编写一段程序,将内部数据存储器30H、3lH单元内容传送到外部数据存储器1000H、1001H
相关推荐: