当前位置:文档之家› 第3章答案指令系统1-40

第3章答案指令系统1-40

第3章指令系统1,简述下列基本概念:指令,指令系统,机器语言,汇编语言,高级语言。

1、指令:CPU根据人的意图来执行某种操作的命令指令系统:一台计算机所能执行的全部指令集合机器语言:用二进制编码表示,计算机能直接识别和执行的语言汇编语言:用助记符、符号和数字来表示指令的程序语言高级语言:独立于机器的,在编程时不需要对机器结构及其指令系统有深入了解的通用性语言2,什么是计算机的指令和指令系统?2、见第1题。

3,简述89C51汇编指令格式。

3、操作码[目的操作数] [,源操作数]4,简述89C51寻址方式和所能涉及的寻址空间。

5,要访问特殊功能寄存器和片外数据寄存器,应采用哪些寻址方式?5、SFR:直接寻址,位寻址,寄存器寻址;片外RAM:寄存器间接寻址6,在89C51片内RAM中,已知(30H)=38H, (38H)=40H, (40H)=48H, (48H)=90H, 请分析下面各是什么指令,说明源操作数的寻址方式以及按顺序执行每条指令后的结果。

6、MOV A,40H ;直接寻址(40H)→AMOV R0,A ;寄存器寻址(A)→R0MOV P1,#0F0H ;立即数寻址0F0→P1MOV @R0,30H ;直接寻址(30H)→(R0)MOV DPTR,#3848H ;立即数寻址3848H→DPTRMOV 40H,38H ;直接寻址(38H)→40HMOV R0,30H ;直接寻址(30H)→R0MOV P0,R0 ;寄存器寻址(R0 )→P0MOV 18H,#30H ;立即数寻址30H→18HMOV A,@R0 ;寄存器间接寻址((R0)) →AMOV P2,P1 ;直接寻址(P1)→P2最后结果:(R0)=38H,(A)=40H,(P0)=38H,(P1)=(P2)=0F0H,(DPTR)=3848H,(18H)=30H,(30H)=38H,(38H)=40H,(40H)=40H,(48H)=38H 注意:→左边是内容,右边是单元7,对89C51片内RAM的高128字节的地址空间寻址要注意什么7、用直接寻址,位寻址,寄存器寻址8,指出下列指令的本质区别。

8,MOV A,DATA ;直接寻址2字节1周期MOV A,#DATA ;立即数寻址2字节1周期MOV DATA1,DATA2 ;直接寻址3字节2周期MOV 74H,#78H ;立即数寻址3字节2周期如果想查某一指令的机器码,字节数或周期数可查阅书本后面的附录A9,设R0内容为32H, A的内容为48H, 片内RAM的32H单元内容为80H, 40H单元内容为08H, 请指出在执行下列程序段后上述各单元内容的变化。

9、MOV A,@R0 ;((R0))=80H→AMOV @R0,40H ;(40H)=08H→(R0)MOV 40H,A ;(A)=80→40HMOV R0,#35H ;35H→R0最后结果:(R0)=35H (A)=80H,(32H)=08H,(40H)=80H10,如何访问SFR,可使用哪些寻址方式?10、用直接寻址,位寻址,寄存器寻址11,如何访问片外RAM,可使用哪些寻址方式?11、只能采用寄存器间接寻址(用MOVX指令)12,如何访问片内RAM,可使用哪些寻址方式?12、低128字节:直接寻址,位寻址,寄存器间接寻址,寄存器寻址(R0~R7)高128字节:直接寻址,位寻址,寄存器寻址13,如何访问片内外程序存储器,可使用哪些寻址方式?13、采用变址寻址(用MOVC指令)14,说明十进制调整的原因和方法。

14、压缩BCD码在进行加法运算时应逢十进一,而计算机只将其当作十六进制数处理,此时得到的结果不正确。

用DA A指令调整(加06H,60H,66H)15,说明89C51的布尔处理机功能。

15、用来进行位操作16,已知(A)=83H, (R0)=17H, (17H)=34H, 请写出执行完下列程序段后A的内容。

16、ANL A,#17H ;83H∧17H=03H→AORL 17H,A ;34H∨03H=37H→17HXRL A,@R0 ;03H⊕37H=34HCPL A ;34H求反等于CBH所以(A)=CBH17,使用位操作指令实现下列逻辑功能,要求不得改变未涉及位的内容。

(1)使ACC.0置1;(2)清除累加器高4位;(3)清除ACC.3,ACC.4,ACC.5,ACC.6 。

17、(1)SETB ACC.0或SETB E0H ;E0H是累加器的地址(2)CLR ACC.7CLR ACC.6CLR ACC.5CLR ACC.4(3)CLR ACC.6CLR ACC.5CLR ACC.4CLR ACC.318,编程实现把内部RAM R0~R7 的内容传递到20H~27H单元。

18、MOV 27H,R7MOV 26H,R6MOV 25H,R5MOV 24H,R4MOV 23H,R3MOV 22H,R2MOV 21H,R1MOV 20H,R019,试编写程序,将内部RAM 20H、21H和22H3个连续单元的内容依次存入2FH、2EH 和2DH 中。

19、MOV 2FH,20HMOV 2EH,21HMOV 2DH,22H20,编写程序,进行两个16位数减法,6F5DH –13B4H, 结果存入内部RAM的30H和31H单元,30H存储低8位。

20、CLR CMOV A,#5DH ;被减数的低8位→AMOV R2,#0B4H ;减数低8位→R2SUBB A,R2 ;被减数减去减数,差→AMOV 30H,A ;低8位结果→30HMOV A,#6FH ;被减数的高8位→AMOV R2,#13H ;减数高8位→R2SUBB A,R2 ;被减数减去减数,差→AMOV 31H,A ;高8位结果→30H注意:如果在你的程序中用到了进位位,在程序开始的时候要记得清0进位位21,编写程序,若累加器A的内容分别满足下列条件,则程序转至LABEL存储单元。

设A中存储的是无符号数。

(1)A≥10; (2)A>10; (3)A≤10。

21、(1)A≥10CJNE A,#0AH,L1 ;(A)与10比较,不等转L1LJMP LABEL ;相等转LABELL1:JNC LABEL ;(A)大于10,转LABEL或者:CLR CSUBB A,#0AHJNC LABEL(2)A>10CJNE A,#0AH,L1 ;(A)与10比较,不等转L1RET ;相等结束L1:JNC LABEL ;(A)大于10,转LABELRET ;(A)小于10,结束或者:CLR CSUBB A,#0AHJNC L1RETL1:JNZ LABELRET(3)A≤10CJNE A,#0AH,L1 ;(A)与10比较,不等转L1L2:LJMP LABEL ;相等转LABELL1:JC L2 ;(A)小于10,转L2RET或者:CLR CSUBB A,#0AHJC LABELJZ LABELRET22,已知(SP)=25H, (PC)=2345H, (24H)=12H, (25H)=34H, (26H)=56H。

问此时执行“RET”指令以后,(SP)=? (PC)=?22、(SP)=23H,(PC)=3412H参看书上80页23,若(SP)=25H, (PC)=2345H, 标号LABEL所在地址为3456H。

问执行长调用指令“LCALL LABEL”后,堆栈指针和堆栈内容发生什么变化?PC值等于什么?23、(SP)=27H,(26H)=48H,(27H)=23H,(PC)=3456H参看书上79页24,上题中LCALL指令能否直接换成ACALL指令,为什么?如果使用ACALL 指令,则可调用的地址范围是什么?24、不能。

ACALL是短转指令,可调用的地址范围是2KB。

在看这个题的时候同时看一下AJMP指令。

同时考虑调用指令ACALL和LCALL 指令和RET指令的关系。

25,编写指令,查找在内部RAM的20H~50H单元中是否有0AAH这一数据。

若有,则将51H单元置为01H;若未找到,则将51H单元清0。

25、MOV R2,#31H ;数据块长度→R2MOV R0,#20H ;数据块首地址→R0LOOP:MOV A,@R0 ;待查找的数据→ACLR C ;清进位位SUBB A,#0AAH ;待查找的数据是0AAH吗JZ L1 ;是,转L1INC R0 ;不是,地址增1,指向下一个待查数据DJNZ R2,LOOP ;数据块长度减1,不等于0,继续查找MOV 51H,#00H ;等于0,未找到,00H→51HRETL1:MOV 51H,#01H ;找到,01H→51HRET26,编写指令,查找在内部RAM的20H~50H单元中出现00H的次数,并将查找结果存入51H单元。

26、MOV R2,#31H ;数据块长度→R2MOV R0,#20H ;数据块首地址→R0LOOP:MOV A,@R0 ;待查找的数据→AJNZ L1 ;不为0,转L1INC 51H ;为0,00H个数增1L1:INC R0 ;地址增1,指向下一个待查数据DJNZ R2,LOOP ;数据块长度减1,不等于0,继续查找RET27,外部数据RAM中有一个数据块,存有若干字符、数字,首地址为SOURCE。

要求将该数据块传送到内部RAM以DIST开始的区域,直到遇到字符“$”时结束(“$”也要传送,它的ASCII码是24H)。

27、MOV DPTR,#SOURCE ;源首地址→DPTRMOV R0,#DIST ;目的首地址→R0LOOP:MOVX A,@DPTR ;传送一个字符MOV @R0,AINC DPTR ;指向下一个字符INC R0CJNE A,#24H,LOOP ;传送的是“$”字符吗?不是,传送下一个字符RET28,已知R3和R4中存有一个16位的二进制数,高位在R3中,低位在R4中。

请编程将其求补,并存回原处。

28、MOV A,R3 ;取该数高8位→AANL A,#80H ;取出该数符号判断JZ L1 ;是正数,转L1MOV A,R4 ;是负数,将该数低8位→ACPL A ;低8位取反ADD A,#01H ;加1MOV R4,A ;低8位取反加1后→R4MOV A,R3 ;将该数高8位→ACPL A ;高8位取反ADDC A,#00H ;加上低8位加1时可能产生的进位SETB ACC.7MOV R3,A ;高8位取反加1后→R3L1:RET29,已知30H和31H中存有一个16位的二进制数,高位在前,地位在后,请编程将它们乘以2,再存回原单元中。

29、CLR C ;清进位位CMOV A,31H ;取该数低8位→ARLC A ;带进位位左移1位MOV 31H,A ;结果存回31HMOV A,30H ;取该数高8位→ARLC A ;带进位位左移1位MOV 30H,A ;结果存回30H30,内存中有两个4字节以压缩的BCD码形式存放的十进制数,一个存放在30H~33H单元中,一个存放在40H~43H单元请编程求他们的和,结果存放在30H~33H单元中。

相关主题