单片机原理及应用(徐泳龙主编)第2版课后习题参考答案

LJMP #2100H SJMP EEE SJMP EEE SJMP EEE

NEG: LJMP #2200H POSI: LJMP #2300H EEE: SJMP $

3-24 已知30H、31H中存有一个16位二进制数,高位在前低位在后。试编程将它们乘2,再存回原单位中。

START: MOV A,31H

ADD A,31H MOV 31H,A MOV A,30H

ADDC A,30H MOV 30H,A SJMP $

3-25 已知从外部RAM 2000H开始的单元中有20个带符号的补码数,试编程把正数和0取出来存放到内部RAM20H开始的存储单元中(负数为作处理)。

START: MOV R0,#20H

MOV DPTR,#2000H MOV R1,#20H JB ACC.7,NEG MOV @R1,A INC R1 DJNZ R0,LOOP SJMP $

;需处理的数的个数 ;需处理数的起始地址 ;用于存储的目标地址 ;负数不需处理

LOOP: MOVX A,@DPTR

NEG: INC DPTR

第四章 汇编语言程序设计

4-1 什么叫伪指令?伪指令与指令有什么区别?

答:伪指令不属于单片机指令集中的指令,在汇编时不产生目标代码,不影响程序的执行,仅指明在汇编时执行一些特定的操作。如为程序指定一个存储区、将一些数据、表格常数存放在指定的存储单元、对地址赋用户名等。

指令是计算机所能执行的一种基本操作的描述,是计算机软件的基本单元。51单片机单片机的指令有二种表达方式:机器码指令和汇编语言指令。

4-2 循环程序由哪几部分组成?

答:由初始化部分、循环处理部分、循环控制部分、循环结束部分这四部分组成。

4-3 什么是子程序?对于子程序设计有什么要求?

答:一段具有某一特定功能,能被其它程序所调用,调用结束后能自动返回到调用处的程序块就称为子程序。

对子程序设计的要求:

4-4 试对下列程序进行人工汇编,并说明此程序的功能。

地址 ; ;1000H ;1002H ;1004H ;1006H ;1007H ;1008H ;1009H ;100AH ;100BH ;100CH ;100EH ;

78 79 7A C3 E4 E6 37 18 19 DA 80

FA FE 25 2b 06

指令码

ORG 1000H MOV R1,#2BH MOV R2,#06H CLR C CLR A

ACDL: MOV R0,#25H

LOOP: MOV A,@R0

ADDC A,@R1 DEC R0 DEC R1 SJMP $ END

DJNZ R2,LOOP

1008H-100EH=-06H,其补码为(11111010)2→0FAH

功能:将25H单及前5个数与2BH单元及前5个数分6组相加,结果丢弃。 4-5 从内部RAM的20H单元开始,有15个数据。试编一程序,把其中的正数、负数分别送到41H和61H开始的存储单元,并分别将正数、负数的个数送40H单元和60H单元。

MOV R0,#41H MOV R1,#61H MOV SP,#2EH MOV R3,#00H MOV R4,#00H MOV R7,#15

JB ACC.7,NEG

;存放正数的起始地址 ;存放负数的起始地址 ;指明栈顶地址 ;正数个数 ;负数个数 ;需判断数的个数 ;出栈放入A ;负数跳转

LOOP: POP ACC

CJNE A,#00H,LOOP1 SJMP LOOP INC R0 INC R3

;非负非零转正数处理 ;零不处理,取下一个数 ;正数保存 ;正数存放地址加1 ;正数个数加1 ;未结束就继续 ;将负数送负数保存地址 ;负数地址加1 ;负数个数加1 ;未结束就继续 ;正数个数送40H单元 ;负数个数送60H单元

LOOP1:MOV @R0,A

SJMP LOOP2 INC R1 INC R4

NEG: MOV @R1,A

LOOP2: DJNZ R7,LOOP

MOV 40H,R3 MOV 60H,R4 SJMP $ END

4-6 设内部RAM的30H和31H单元中有二个带符号数求出其中的大数存放在32H单元中。

MOV A,30H XRL A,31H JB ACC.7,LOOP MOV A,30H SUBB A,31H JC LOOP1 MOV 32H,30H

SJMP $ SJMP $ JB ACC.7,LOOP1 MOV 32H,A SJMP $

LOOP1: MOV 32H,31H LOOP: MOV A,30H

4-7 试编制实现ASCII码转十进制数的程序。在8032单片机内RAM的40H单元中存放一个代码。若此代码为十进制数的ASCII码,则将其相应的十进制数送片内RAM的50H单元,否则将此单元置成0FFH。

MOV A,40H CLR C SUBB A,#30H JC LOOP MOV R0,A MOV A,#09H SUBB A,R0 JC LOOP

;减30H后差大于0,是否不 ; 大于9? ;差大于9,跳转

;数字比其ASCII码值小30H

;存的ASCII值小于0的ASCII码值跳转

MOV 50H,R0 SJMP $

;将数字存入50H单元 ;不是数字,存入0FFH

LOOP:MOV 50H,#0FFH

SJMP $ END

4-8 试编程将存放在8032单片机内部RAM中首址为20H、长度为50H的数据快传送到片外RAM以20H为首址的连续单元中。

MOV R0,#20H MOV R1,#20H MOV R7,#50H MOVX @R1,A

INC R0 INC R1 DJNZ R7,LOOP SJMP $

LOOP: MOV A,@R0

4-9 设一个字符串存放在8032单片机内部RAM以20H为首址的连续单元中,字符串以回车结束。要求统计该字符串中字符C(’C’=43H)的个数,并将其存入外部RAM的40H单元。试编写实现上述要求的程序。

MOV R0,#20H MOV R2,#00H XRL A,#0DH JZ EXIT MOV A,@R0 XRL A,#43H JNZ LOOP2

INC R2 SJMP LOOP MOV A,R2 MOVX @DPTR,A SJMP $ END

LOOP2: INC R0

EXIT: MOV DPTR,#0040H

LOOP: MOV A,@R0 ;判断是否是回车符

4-10 设有一长度为20H的字符串,它存放在片外RAM1000H为首地址的连续单元中。试编制将其中数字与字母分开并将它们送到片内RAM以30H和50H为首地址的连续单元中的程序。

MOV DPTR,#1000H MOV R7,#20H MOV R0,#30H MOV R1,#50H CJNE A,#30H,LOOP1 SJMP ISNUM

LOOP1: JNC LOOP2

SJMP ISCHAR

LOOP2: CJNE A,#3AH,LOOP3 LOOP3:JC ISNUM

SJMP ISCHAR INC R1

ISCHAR:MOV @R1,A

LOOP: MOVX A,@DPTR

SJMP NEXT SUBB A,#30H MOV @R0,A INC R0

SJMP NEXT DJNZ R7,LOOP SJMP $ END

ISNUM:CLR C NEXT: INC DPTR

4-11 试编程将片内RAM区DATA1单元开始的20H个单字节依次与DATA2单元为起始地址的20H个单字节进行交换。

MAIN: MOV R7,#20H

DATA1 EQU 20H DATA2 EQU 40H MOV R0,#DATA1 MOV R1,#DATA2 XCH A,@R1

MOV @R0,A INC R0 INC R1 DJNZ R7,LOOP SJMP $ END

LOOP: MOV A,@R0

4-13 设片内RAM的20H~4FH单元中有若个无符号数,试编程求出其中的最大值及所在单元地址,将最大值存入片内RAM的50H单元,最大值所在单元地址存入片内RAM的51H单元。

MOV R0,#20H MOV R7,#20H MOV A,R0 MOV R2,A MOV A,@R0 MOV R1,A CLR C SUBB A,@R0 JNC LOOP1

MOV A,R0 MOV R2,A MOV A,@R0 MOV R1,A DJNZ R7,LOOP MOV 50H,R1 MOV 51H,R2 SJMP $ END

LOOP1:MOV A,R1

LOOP: INC R0

4-14 设片外RAM从1000H单元开始存放100个无符号8位二进制数。试编程将它们从大到小依次入片内RAM从10H开始的单元中。

MOV R7,#100 MOV DPTR,#1000H MOV R0,#10H MOV @R0,A

INC DPTR INC R0 DJNZ R7,LOOP MOV R7,#99

LOOP: MOVX A,@DPTR

MOV R6,#99

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4