当前位置:首页 > 第4章《单片机原理与C51基础》赵丽清(课后习题及答案)
思考题:
【4-1】说明伪指令的作用。“伪”的含义是什么?常用伪指令有哪些,其功能如何? 【4-2】解释下列术语:
(1)手工汇编 (2)机器汇编
【4-3】下列程序段经汇编后,从1000H开始的各有关存储单元的内容是什么? ORG 1000H
TAB1 EQU 1234H TAB2 EQU 3000H DB 0,1,4,5
DW TAB1,TAB2,70H
【4-4】设计子程序时应注意哪些问题?
【4-5】试编写一个程序,将内部RAM中45H单元的高4位清0,低4位置1。
【4-6】已知程序执行前有A=02H,SP=42H,(41H)=FFH,(42H)=FFH。下述程序执行后,A=( );SP=( );(41H)=( );(42H)=( );PC=( )。 POP DPH POP DPL
MOV DPTR,#3000H RL A MOV B,A
MOVC A,@A+DPTR PUSH ACC MOV A,B INC A
MOVC A,@A+DPTR PUSH ACC RET
ORG 3000H
DB 10H,80H,30H,80H,50H,80H
【4-7】试编写程序,查找在内部RAM的30H~50H单元中是否有0AAH这一数据。若有,则将51H单元置为“01H”;若未找到,则将51H单元置为“00H”。
【4-8】试编写程序,查找在内部RAM的20H~40H单元中出现“00H”这一数据的次数,并将查找到的结果存入41H单元。
【4-9】在内部RAM的21H单元开始存有一组单字节无符号数,数据长度为20H,编写程序,要求找出最大数存入MAX单元。
【4-10】若SP=60H,标号LABEL所在的地址为3456H。LCALL指令的地址为2000H,执行如下指令:
2000H LCALL LABEL
后,堆栈指针SP和堆栈内容发生了什么变化? PC的值等于什么?如果将指令LCALL直接换成ACALL是否可以?如果换成ACALL指令,可调用的地址范围是什么? 【4-11】若80C51的晶振频率为6MHZ,试计算延时子程序的延时时间?
DELAY:MOV R7,#0F6 ;1个机器周期 LP:MOV R6,#0FA ; 1个机器周期 DJNZ R6,$ ; 2个机器周期 DJNZ R7,LP ; 2个机器周期
RET ; 2个机器周期
【4-12】编写子程序,将R1中的2个十六进制数转换为ASCII后存入R3和R4。
第四章思考题答案:
【4-1】解答:程序设计者使用汇编语言编写的源程序必须经过编译才能在单片机中运行,因此在汇编语言源程序中一般会采用伪指令来向编译器发出指示(命令)信息,告诉它如何完成汇编工作。
“伪”表示其不能命令CPU执行某种操作,也没有对应的机器代码。 常用伪指令及其功能(略)。 【4-2】解答:
手工汇编是把程序用助记符指令写出后,人为查找指令代码表,逐个把助记符指令翻译成机器码。由于手工汇编是按绝对地址进行定位的,所以对于偏移量的计算和程序的修改有诸多不便,现在已经不被采用。
机器汇编是在计算机上使用编译软件对源程序进行汇编。整个工作由PC机来完成,且最后生成一个*.HEX或*.BIN机器码形式的目标程序文件,整个传输过程既快捷又方便。 【4-3】解答:
首先,我们应该清楚EQU只是声明TAB1代表1234H值,TAB2代表3000H,而TAB1和 TAB2仅在后边在做相应的替换时候,才会分配内存空间。因此,在本题中只有DB,DW分配了相应的内存空间。
DB,DW分别为定义字节和字,所以从1000H开始的空间分配如下所示:
存储单元地址 1000H 1001H 1002H 1003H 1004H 1005H 1006H 1007H 1008H 1009H 存储单元存放的内容 00H 01H 04H 05H 34H 12H 00H 30H 70H 00H 共10个字节的存储单元。 【4-4】解答:
(1) 要给每个子程序赋一个名字,实际上是子程序入口地址的符号。
(2) 明确入口条件、出口条件。所谓入口条件,表明子程序需要哪些参数,放在哪个寄存器和哪个内存单元;出口条件则表明子程序处理的结果是如何存放的。
(3) 注意保护现场和恢复现场。在执行子程序时,可能要使用累加器或某些工作寄存器。而在调用子程序之前,这些寄存器中可能存放有主程序的中间结果,这些中间结果在主程序中仍有用,这就要求在子程序使用累加器和这些工作寄存器之前,要将其中的内容保护起来,即保护现场。当子程序执行完毕,即将返回主程序之前,再将这些内容取出,送到累加器或原来的工作寄存器中,这一过程称为恢复现场。 【4-5】解答: ORG 0000H
AJMP START
ORG 0100H
START:MOV 45H, #0FH END 或
ORG 0000H AJMP START ORG 0100H
START: ANL 45H,#0FH
ORL 45H,#0FH END
【4-6】解答:
上述程序执行后,A=(80H);SP=(40H);(41H)=(50H);(42H)=(80H); PC=(8050H)。 【4-7】解答: 程序如下:
第一种方法: ORG 0000H START:
MOV R0,#30H ;置数据块首地址 MOV R6,#20H ;数据长度 LOOP:
MOV A,#0AAH
SUBB A,@R0 ;A=A-((R0)) INC R0 ;读下一个数
CJNE A,#00H,LOOP1 ;判断A 是否等于零,不等,转LOOP1
MOV 51H,#01H ;等于零,即此数为#0AAH, 51H单元被置为01H SJMP STOP LOOP1:
DJNZ R6,LOOP ;判断循环是否结束
MOV 51H,#00H ;没有#0AAH, 51H单元被置为00H STOP:
SJMP $ ;暂停 END
第二种方法: ORG 0000H START:
MOV 51H, #0H ;先设没有找到 MOV R0, #30H ;起始地址 LOOP:
MOV A, @R0 ;取数
CJNE A, #0AAH, NEXT ;不等于就转移
INC 51H ;找到了,(50H)=01H SJMP STOP ;转到结束 NEXT:
INC R0 ;下一个地址
CJNE R0, #51H, LOOP ;没有到末尾就转移 STOP:
SJMP $ ;暂停 END
【4-8】解答:
程序如下: ORG 0000H
MOV 41H,#00H ;对41H单元初始化 MOV R0,#20H ;置数据块首地址 L2:
MOV A,@R0 ;取数为0则转到L1 JZ L1 L3:
INC R0 ;下一个地址
CJNE R0,#41H,L2 ;没有到末尾就转移 AJMP $ L1:
INC 41H ;找到00,则41H单元加1 AJMP L3 END
【4-9】解答:
程序如下: ORG 0000H
MOV R0, #21H ;起始地址.
MOV MAX,#00H ;先用0当做最大值. MOV R2, #20H ;数据长度. LOOP:
MOV A, @R0 ;取来一个数据. CLR C
SUBB A, MAX ;减“最大值”. JNC LOOP1 ;不够减就算了.
MOV A, @R0 ;够减,就把这个数据. MOV MAX,A ;当做最大值. LOOP1:
INC R0 ;转向下一个. DJNZ R2, LOOP ;循环. SJMP $ ;结束. END
【4-10】解答:
执行指令后,SP的内容为62H,03H压入到61H中,20H压入到62H中;PC的值为3456H;
不可以将指令LCALL直接换成ACALL,因为他们的3456H与2003H的高5位不同超过了ACALL指令所能访问的2KB空间范围,如果换成ACALL指令,可调用的地址范围是2000H-27FFH这2KB的空间范围。
【4-11】解答:
F6H=(246)10 FAH=(250)10
1个机器周期=(1÷6)×12=2 us
不含含调用指令延时时间为:[1+(1+250×2+2)×246+2] ×2=0.247482s
含调用指令2个机器周期延时时间:2μs*{[1+((1+2*250+2)*246)+2]+2}=0.247486s
【4-12】解答: 子程序如下:
ORG 0000H MOV A,R1
ANL A,#0F0H ;屏蔽低4位,保留高四位 SWAP A
ACALL ASCII ;调用子程序计算高位的ASCII值 MOV R3,A ;高位的ASCII码保存在R3中 MOV A,R1
ANL A, #0FH ;屏蔽高4位,保留低四位
ACALL ASCII ;调用子程序计算低位的ASCII值 MOV R4, A ;低位的ASCII码保存在R3中 SJMP $
ASCII: ;计算ASCII码子程序
PUSH ACC CLR C
SUBB A, #0AH POP ACC JC LOOP ADD A, #07H LOOP:
ADD A, #30H RET END
共分享92篇相关文档