3.4 MCS-51共有哪几种寻址方式?各有什么特点? 答: 共有7种寻址方式。
(1)寄存器寻址方式 操作数在寄存器中,因此指定了寄存器就能得到操作数。 (2)直接寻址方式 指令中操作数直接以单元地址的形式给出,该单元地址中的内容就是操作数。
(3)寄存器间接寻址方式 寄存器中存放的是操作数的地址,即先从寄存器中找到操作数的地址,再按该地址找到操作数。
(4)立即寻址方式 操作数在指令中直接给出,但需在操作数前面加前缀标志“#”。 (5)基址寄存器加变址寄存器间接寻址方式 以DPTR或PC作基址寄存器,以累加器A作为变址寄存器,并以两者内容相加形成的16位地址作为操作数的地址,以达到访问数据表格的目的。
(6)位寻址方式 位寻址指令中可以直接使用位地址。
(7)相对寻址方式 在相对寻址的转移指令中,给出了地址偏移量,以“rel”表示,即把PC的当前值加上偏移量就构成了程序转移的目的地址。 3.5 MCS-51指令按功能可以分为哪几类?
答:MCS-51指令系统按功能分为:数据传送类(28条);算术操作类(24条);逻辑运算类(25条);控制转移类(17条);位操作类(17条)。 3.6 访问SFR,可使用哪些寻址方式?
答:一般采用直接寻址,对于SFR中字节地址能被8整除的SFR可以使用位寻址,对于SFR中的A、B、DPTR寄存器可以采用寄存器寻址。
3.7 指令格式是由(操作码)和(操作数)所组成,也可能仅由(操作码)组成。 3.8 假定累加器A中的内容为30H,执行指令:
1000H:MOVC A,@A+PC
后,把程序存储器(1031H)单元的内容送入累加器中
3.9 在MCS----51中,PC和DPTR都用于提供地址,但PC是为访问(程序)存储器提供地址,而DPTR是为访问(数据)存储器提供地址。
3.10 在寄存器间接寻址方式中,其“间接”体现在指令中寄存器的内容不是操作数,而是操作数的(地址)。
3.11 该程序段的功能是什么?
PUSH A
第 6 页 共 26 页
PUSH B POP A POP B
答:功能是A、B内容互换
3.12 已知程序执行前有A=02H,SP=52H,(51H)=FFH,(52H)=FFH。下列程序执行后: POP DPH POP DPL
MOV DPTR,#4000H RL A MOV B,A
MOVC A,@A+DPTR PUSH A MOV A,B INC A
MOVC A,@A+DPTR PUSH A RET
ORG 4000H
DB 10H,80H,30H,50H,30H,50H
A=50H SP=50H (51H)=30H (52H)=50H PC=5030H 3.13 写出完成如下要求的指令,但是不能改变未涉及位的内容。 (A)把Acc.3,Acc.4,Acc.5和Acc.6清0。
解:ANL A,#87H (B)把累加器A的中间4位清0。
解:ANL A,#C3H (C)使Acc.2和Acc.3置1。
解:ORL A,#0CH
3.14 假定A=83H,(R0)=17H,(17H)=34H,执行以下指令:
ANL A,#17H
ORL 17H,A XRL A,@R0 CPL A
后,A的内容为(0CBH)
3.15 假设A=55H,R3=0AAH,在执行指令后ANL A,R3后, A=(00H), R3=(0AAH) 3.16 如果DPTR=507BH,SP=32H,(30H)=50H,(31H)=5FH,(32H)=3CH,则执行下列指令后:
POP DPH
第 7 页 共 26 页
POP DPL POP SP
则:DPH=(3CH) DPL=(5FH) SP=(4FH) 3.17 假定SP=60H,A=30H,B=70H,执行下列指令:
PUSH A PUSH B
后,SP的内容为(62H),61H单元的内容为(30H),62H单元的内容为(70H)。 3.18借助本书中的指令表:表3-3~表3-7对如下的指令代码(16进制)进行手工反汇编。
FF C0 E0 E5 F0 F0 解:查表可知
FF MOV R7,A
C0 E0 PUSH 0E0H E5 F0 MOV A,0F0H F0 MOVX @DPTR, A
第四章 MCS-51汇编语言程序设计
4.1 用于程序设计的语言分为哪几种?它们各有什么特点?
答:用于程序设计的语言基本上分为三种:机器语言、汇编语言和高级语言。
(1)机器语言:在单片机中,用二进制代码表示的指令、数字和符号简称为机器语言,直接用机器语言编写的程序称为机器语言程序。用机器语言编写的程序,不易看懂,不便于记忆,且容易出错。(2)汇编语言具有如下特点:A、汇编语言是面向机器的语言,程序设计人员必须对MCS----51单片机的硬件有相当深入的了解。B、助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用的存储空间小,运行速度快,因此用汇编语言能编写出最优化的程序。C、汇编语言程序能直接管理和控制硬件设备(功能部件),它能处理中断,也能直接访问存储器及I/O接口电路。(3)高级语言:高级语言不受具体机器的限制,都是参照一些数学语言而设计的,使用了许多数学公式和数学计算上的习惯用语,非常擅长于科学计算。计算机不能直接识别和执行高级语言,需要将其“翻译”成机器语言才能识别和执行。
4.3 解释下列术语:“手工汇编”、“机器汇编”、“交叉汇编”以及“反汇编”。
答、手工汇编:通常把人工查表翻译指令的方法称为“手工汇编”。机器汇编:机器汇编实际上是通过执行汇编程序来对源程序进行汇编的。交叉汇编:由于使用微型计算机完成了汇
第 8 页 共 26 页
编,而汇编后得到的机器代码却是在另一台计算机(这里是单片机)上运行,称这种机器汇编为“交叉汇编”。反汇编:有时,在分析现成产品的ROM/EPROM中的程序时,要将二进制数的机器代码语言程序翻译成汇编语言源程序,该过程称为反汇编。 4.4 下列程序段经汇编后,从1000H开始的各有关存储单元的内容将是什么?
ORG 1000H
TAB1 EQU 1234H TAB2 EQU 3000H DB “MAIN”
DW TAB1,TAB2,70H
答:(1000H)=‘M’(1001H)=‘A’(1002H)=‘I’(1003H)=‘N’(1004H)=34H (1005H)=12H (1006H)=00H (1007H)=30H (1008H)=70H (1009H)=00H 4.5 设计子程序时注意哪些问题? 答:在编写子程序时应注意以下问题:
(1)子程序的第一条指令的地址称为子程序的入口地址。该指令前必须有标号。 (2)主程序调用子程序,是通过主程序或调用程序中的调用指令来实现的。
(3)注意设置堆栈指针和现场保护,因调用子程序时,要把断点压入堆栈,子程序返回执行RET指令时再把断点弹出堆栈送入PC指针,因此子程序结构中必须用堆栈。
(4)子程序返回主程序时,最后一条指令必须是RET指令,它的功能是在执行调用指令时,把自动压入堆栈中的断点地址弹出送入PC指针中,从而实现子程序返回主程序断点处继续执行主程序。
(5)子程序可以嵌套,即主程序可以调用子程序,子程序又可以调用另外的子程序,通常情况下可允许嵌套8层。
(6)在子程序调用时,还要注意参数传递的问题。
4.6 试编写1个程序,将内部RAM中45H单元的高4位清0,低4位置1。 解: MOV A,45H ANL A,#0FH
ORL A,#0FH
4.7 已知程序执行前有A=02H,SP=42H,(41H)=FFH,(42H)=FFH。下述程序执行后,
POP DPH
POP DPL
MOV DPTR,#3000H RL A MOV B,A
MOVC A,@A+DPTR
第 9 页 共 26 页
PUSH A MOV A,B INC A
MOVC A,@A+DPTR PUSH A
ORG 3000H
DB 10H,80H,30H,80H,50H,80H
A=80H SP=40H (41H)=50H (42H)=80H PC=8050H。
4.8 计算下面子程序中指令的偏移量和程序执行的时间(晶振频率为12MHZ)。 7B0F MOV R3,#15 ;1个机器周期 7CFF DL1: MOV R4,#255 ;1个机器周期 8B90 DL2: MOV P1,R3 ;2个机器周期 DC DJNZ R4,DL2 ;2个机器周期 DB DJNZ R3,DL ;2个机器周期 22 RET ;2个机器周期 解:程序执行的时间为15.346μs。
4.9 假定A=83H,(R0)=17H,(17H)=34H,执行以下指令:
ANL A,#17H
ORL 17H,A XRL A,@R0 CPL A
后,A的内容为(0CBH)
4.10 试编写程序,查找在内部RAM的30H~50H单元中是否有0AAH这一数据。若有,则将51H单元置为“01H”;若未找到,则将51H单元置为“00H”。
ORG 0000H
MOV R0,#30H MOV R2,#21H LOOP: MOV A,@R0
CJNE A,#0AAH,NOT MOV 51H,#01H SJMP DEND NOT: INC R0
DJNZ R2,LOOP MOV 51H,#00H DEND: SJMP DEND
4.11 试编写程序,查找在内部RAM的20H~40H单元中出现“00H”这一数据的次数。并将查找到的结果存入41H单元。
ORG 0000H MOV R0,#20H MOV R2,#21H
第 10 页 共 26 页