您好,欢迎访问三七文档
单片机习题解第三章P841.简述下列基本概念:指令、指令系统、机器语言、汇编语言、高级语言。答:指令是计算机能识别,执行某种操作的命令;指令系统是全部指令的集合;机器语言是用二进制代码编写的指令,计算机可以直接识别和执行;汇编语言是用指令助记符编写的程序,直接操作硬件,可通过汇编程序翻译成机器代码;高级语言是按人的思维习惯编写的程序,不过多涉及硬件,也需要编译程序进行翻译后才能生成可执行文件。2.什么是计算机的指令和指令系统?略•3.简述89C51汇编语言格式•答:标准的89C51汇编语言可由5个段落:•标号:指令助记符第一操作数,第二操作数;注释•LOOP:MOVA,#20H;把20H立即数传送到A累加器•上述5段中,有些是可以省略的,但是指令助记符必须存在。•4.简述89C51的寻址方式和所能涉及的寻址空间•答:寻址方式应指指令中寻找源操作数的方式和途径,89C51有7种方式:•寄存器寻址:片内RAM,如MOVA,R0\•直接寻址:片内RAM,如MOVA,$20H•立即寻址:ROM空间,如MOVA,#40H•寄存器间接寻址:片内RAM,如MOVA,@R1•片外RAM或I/O,如MOVXA,@DPTR•基地址+变址寻址:ROM空间,如MOVCA,@A+DPTR•相对寻址:程序存储器,如DJNZR7,rel•位寻址:程序存储器,如JBC$01H,rel•5.要访问特殊功能寄存器和片外数据存储器,应采用哪些寻址方式?•答:特殊功能寄存器只能用直接寻址方式,访问片外数据存储器只能用寄存器间接寻址方式。•6.在89C51片内RAM中,已知(30H)=38H,(38H)=40H,(40H)=48H,(48H)=90H。请分析下面各是什么指令,说明源操作数的寻址方式以及按顺序执行每条指令后的结果。•注意:()应理解为容器•MOVA,40HA=48H40H是容器,其中数值是48H•MOVR0,AR0=48H•MOVP1,#0F0HP1=11110000B•MOV@R0,30H(48H)=38HR0间址地址为48H,30H容器内数值为38H•MOVDPTR,#3848HDPH=38H,DPL=48H•MOV40H,38H(40H)=40H此前(40H)=48H,而(38H)=40H•MOVR0,30HR0=38H•MOVP0,R0P0=38H=00111000B•MOV18H,#30H(18H)=30H=00110000B•MOVA,@R0A=(38H)=40H•MOVP2,P1P2=P1=0F0H=11110000B•解答此类问题应注意:看清容器和数据的区别,并随时跟踪记录各容器的数值变化。•7.对89C51片内RAM的高128字节的地址空间寻址要注意什么?•答:这部分空间地址只能用直接寻址方式,尽管有时直接写出了SFR的名字,但翻译成机器码时仍然可见是该专用寄存器的直接地址。•8.指出下列指令的本质区别•MOVA,data直接地址内容送累加器•MOVA,#data立即数送累加器•MOVdata1,data2直接地址2内容送直接地址1单元•MOV74H,#78H立即数送直接地址单元•9.设R0的内容为32H,A的内容为48H,片内RAM的32H单元内容为80H,40H单元的内容为08H。请指出在执行下列程序段后上述各单元内容的变化。•MOVA,@R0A=80H•MOV@R0,40H(32)H=08H•MOV40H,A(40H)=80H•MOVR0,#35HR0=35H•10.如何访问SFR,可使用哪些寻址方式?•答:只能使用直接寻址方式•11.如何访问片外RAM单元,可使用哪些寻址方式?•答:只能使用寄存器间接寻址方式•12.如何访问片内RAM单元,可使用哪些寻址方式?•答:寄存器寻址,寄存器间址,直接寻址,相对寻址•13.如何访问片内外程序存储器,可使用哪些寻址方式?•答:立即寻址,基地址加变址寻址•14.说明十进制调整的原因和方法•答:进行压缩型BCD代码运算时,其运算结果可能超出BCD码的表达范围。如果半字节数据的数值超过9就不再是BCD码,因此需要调整。调整过程是:如果半字节内容大于9,则必须加6,再考虑半进位或进位标志,决定是否做进位运算。这样做的结果是保证半字节数据总是0-9的BCD代码。•15.说明89C51的布尔处理机功能。•答:硬件上,有位累加器C,位地址空间和SFR中的可寻址位;•软件上,有完整的位操作指令集•可实现位变量的传送、赋值和测试转移等功能•16.已知(A)=83H,(R0)=17H,(17H)=34H。请写出执行完下列程序段后A的内容。•ANLA,#17H83H∧17H=03H(结果在A中)•ORL17H,A34H∨03H=37H(结果在17H单元)•XRLA,@R003H⊕37H=34H•CPLAA=11001011B=CBH•17.使用位操作指令实现下列逻辑操作。要求不得改变未涉及位的内容。•答:⑴使ACC.0置1SETBACC.0•⑵清除累加器高4位CLRACC.7•CLRACC.6•CLRACC.5•CLRACC.4本题按要求只能这样解•⑶清除ACC.3,ACC.4,ACC.5,ACC.6•CLRACC.3•CLRACC.4•CLRACC.5•CLRACC.6•本题可有简单方法,比如进行与或操作,但那属于字节操作,与题意不符,应避免。•18.编程实现把内部RAMR0-R7的内容传递到20H-27H单元•解:本题困难在于,为了实现循环,要使用工作寄存器组,但它们同时又是源操作数。做如下讨论:•不失一般性,设当前使用工作寄存器0区,对应R0地址为00H。。。。•SEND:SETBRS0切到1区(08H-0FH)•MOVR0,#00H指向源首地址•MOVR1,#20H指向目的首地址•MOVR7,#08H循环次数初值•CYCLE:MOVA,@R0取源操作数•MOV@R1,A存目的操作数•INCR0修改指针•INCR1•DJNZR7,CYCLE判循环是否结束•本题也可以直接操作,会显得很呆板:•SEND:MOV20H,R0•MOV21H,R1•MOV22H,R2•MOV23H,R3•MOV24H,R4•MOV25H,R5•MOV26H,R6•MOV27H,R7•19.试编写程序,将内部RAM的20H、21H和22H3个连续单元的内容依次存入2FH、2EH和2DH中。•解:•MOV2FH,20H•MOV2EH,21H•MOV2DH,22H•本题也可以用循环程序实现,但语句并不节省•20.编写程序,进行两个16位数的减法,6F5DH-13B4H,结果存入内部RAM的30H和31H单元,30H存储低8位。•解:•SUBB:CLRC;清进位位•MOVA,5DH;取被减数低8位•SUBBA,#B4H;减去减数低8位•MOV30H,A;存差低8位•MOVA,6FH;取被减数高8位•SUBBA,#13H;减去减数高8位和借位•MOV31H,A;存高8位•RET;结束•21.编写程序,若累加器A的内容分别满足下列条件,则程序转至LABLE存储单元。设A中存的是无符号数。•⑴A≥10;⑵A10;⑶A≤10.•解:此题应分别编程,三个条件分别处理•⑴CLRC;清进位位•SUBBA,#0AH;A=A-10•JNCLABLE;无借位,满足条件,转出••⑵CLRC;清进位位•SUBBA,#0BH;A=A-11•JNCLABLE;无借位,满足条件,转出••⑶CLRC;清进位位•SUBBA,#0BH;A=A-11•JCLABLE;有借位,满足条件,转出•22.已知(SP)=25H,(PC)=2345H,(24H)=12H,(25H)=34H,(26H)=56H。问此时执行“RET”指令以后,(SP)=?(PC)=?•答:本题考察对堆栈指针操作的概念理解。其中SP是堆栈当前指针位置,执行RET表示当前在执行子程序,说明曾经压入过堆栈2字节返回地址。可画图如下页:•还需要了解:压入堆栈时是先低字节后高字节。•则答案为:执行RET指令后,SP=SP-2-23H•PC=3412H•题目中26H单元内容是干扰项,不必理会。•23.若(SP)=25H,(PC)=2345H,标号LABLE所在的地址是3456H,问执行长调用指令“LCALLLABLE”后,堆栈指针和堆栈的内容发生什么变化?PC的值等于什么?•答:执行长调用指令后,2字节返回地址入栈,SP=SP+2=27H,且先压入低字节后压入高字节,因此(26H)=48H,(27H)=23H,PC=3456H。•24.上题中的LCALL指令能否直接换成ACALL指令,为什么?如果使用ACALL指令。则可调用的地址范围是什么?•答:ACALL指令的调用距离是2K字节,在本例中,调用距离是3456H-2345H=1111H=4369D,超过2K字节的2048D,因此不能直接替换成ACALL指令。•25.试编写程序,查找在内部RAM的20H-50H单元中是否有0AAH这一数据。若有,则将51H单元置为01H;若未找到,则将51H单元清0。•答:注意20H-50H单元共49个单元而不是48个。•FIND:MOVR0,#20H•MOVR7,#49D•MOV51H,#00H•FIND2:MOVA,@R0•INCR0•CJNEA,#0AAH,NEXT•MOV51H#01H•AJMPOVER•NEXT:DJNZR7,FIND2•OVER:RET•26.试编写程序,查找在内部RAM的20H-50H单元中出现00H的次数,并将查找的结果存入51H单元。•解:•FIND:MOVR0,#20H;取数据首地址•MOVR7,#49D;置循环计数器初值•MOV51H,#00H;结果计数器初值为0•FIND2:MOVA,@R0;取一个数据•INCR0;修改取数指针•JNZNEXT;非0,跳转•INC51H;0,计数器加1•NEXT:DJNZR7,FIND2;判是否结束,未结束返回继续•RET;结束•28.已知R3和R4中有一个16位的二进制数,高位在R3中,低位在R4中。请编程将其求补,并存回原处。•解:将R3R4当做有符号数,若R3最高位为0则为正,不求;若否,则此位保留,其余各位求反加1.•COMP:MOVA,R3;取高字节•JNBACC.7,OVER;若符号位为0转结束•CPLA;高字节取反•SETBACC.7;恢复符号位•MOVR3,A;存回•MOVA,R4;取低字节•CPLA;求反•ADDA,#01H;加1•MOVR4,A;存回•MOVA,R3;取高字节•ADDCA,#00H;加进位•MOVR3,A;存回•OVER:RET;结束•29.已知30H和31H中存有一个16位二进制数,高位在前,低位在后。请编程将它们乘以2,再存回原单元中。•解:理论上,双字节数乘以2后可能超过2字节,本题默认不会发生这种情况,即30H最高位不是1。可采用左移一次的方法实现*2。带进位左移,且先移低字节。•MULTIY:CLRC;清进位位•MOVA,31H;取低字节•RLCA;带进位左移,最高位进入C•MOV31H,A;低字节存回•MOVA,30H;取高字节•RLCA;带进位左移,最低位是31H最高位,最高位移出丢失•MOV30H,A;存回•RET;结束•30.内存中有两个4字节以压缩的BCD码形式存放的十六进制数,一个存放在30H-33H的单元中,一个存放在40H-43H的单元中。请编程求它们的和,结果放在30H-33H中。•解:理论上,这两个BCD数相加后可能超过4字节表达范围。本题默认不会出现这种情况。•另外应注意进行BCD加法时应进行十进制调整。•ADDM:MOVA,$43H;注释略•ADDA,$33H•DAA•MOVA,$33H•MOVA,$42H•ADDCA,$32H•DAA•MOV$32H,A•MOVA,$41H•ADDCA,$31H•DAA•MOV$31H,A•MOVA,40H•ADDCA,$30H•DAA•MOV30H,A•RET•31.编写一个程序,把片外RAM从2000H开始存放的8个数据传送到片内30H
本文标题:单片机习题解
链接地址:https://www.777doc.com/doc-5163523 .html