第3章答案指令系统1-40 下载本文

第3章 指令系统

1,简述下列基本概念:指令,指令系统,机器语言,汇编语言,高级语言。 1、指令:CPU根据人的意图来执行某种操作的命令 指令系统:一台计算机所能执行的全部指令集合

机器语言:用二进制编码表示,计算机能直接识别和执行的语言 汇编语言:用助记符、符号和数字来表示指令的程序语言

高级语言:独立于机器的,在编程时不需要对机器结构及其指令系统有深入了解的通用性语言

2,什么是计算机的指令和指令系统? 2、见第1题。

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

3、操作码 [目的操作数] [,源操作数]

4,简述89C51寻址方式和所能涉及的寻址空间。 4、 寻址方式 立即数寻址 直接寻址 寄存器寻址 寄存器间接寻址 变址寻址 相对寻址 位寻址 程序存储器ROM 片内RAM低128B、特殊功能寄存器 工作寄存器R0-R7、A、B、C、DPTR 片内RAM低128B、片外RAM 程序存储器(@A+PC,@A+DPTR) 程序存储器256B范围(PC+偏移量) 片内RAM的20H-2FH字节地址、部分SFR 寻址空间 5,要访问特殊功能寄存器和片外数据寄存器,应采用哪些寻址方式? 5、SFR:直接寻址,位寻址,寄存器寻址;片外RAM:寄存器间接寻址

6,在89C51片内RAM中,已知 (30H)=38H, (38H)=40H, (40H)=48H, (48H)=90H, 请分析下面各是什么指令,说明源操作数的寻址方式以及按顺序执行每条指令后的结果。

6、MOV A,40H ;直接寻址 (40H)→A MOV R0,A ;寄存器寻址 (A)→R0 MOV P1,#0F0H ;立即数寻址 0F0→P1

1

MOV @R0,30H ;直接寻址 (30H) →(R0) MOV DPTR,#3848H ;立即数寻址 3848H→DPTR MOV 40H,38H ;直接寻址 (38H) →40H MOV R0,30H ;直接寻址 (30H) →R0 MOV P0,R0 ;寄存器寻址 ( R0 )→P0 MOV 18H,#30H ;立即数寻址 30H→18H MOV A,@R0 ;寄存器间接寻址 ((R0)) →A MOV 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周期

如果想查某一指令的机器码,字节数或周期数可查阅书本后面的附录A

9,设R0内容为32H, A的内容为48H, 片内RAM的32H单元内容为80H, 40H单元内容为08H, 请指出在执行下列程序段后上述各单元内容的变化。 9、

MOV A,@R0 ;((R0))=80H→A MOV @R0,40H ;(40H)=08H→(R0) MOV 40H,A ;(A)=80→40H MOV R0,#35H ;35H→R0

最后结果:(R0)=35H (A)=80H,(32H)=08H,(40H)=80H

10,如何访问SFR,可使用哪些寻址方式? 10、用直接寻址,位寻址,寄存器寻址

11,如何访问片外RAM,可使用哪些寻址方式? 11、只能采用寄存器间接寻址(用MOVX指令)

12,如何访问片内RAM,可使用哪些寻址方式?

12、低128字节:直接寻址,位寻址,寄存器间接寻址,寄存器寻址(R0~R7)

高128字节:直接寻址,位寻址,寄存器寻址

13,如何访问片内外程序存储器,可使用哪些寻址方式? 13、采用变址寻址(用MOVC指令)

2

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→A

ORL 17H,A ;34H∨03H=37H→17H XRL A,@R0 ;03H⊕37H=34H CPL A ;34H求反等于CBH 所以(A)=CBH

17,使用位操作指令实现下列逻辑功能,要求不得改变未涉及位的内容。

(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.7 CLR ACC.6 CLR ACC.5 CLR ACC.4 (3)CLR ACC.6 CLR ACC.5 CLR ACC.4 CLR ACC.3

18,编程实现把内部RAM R0~R7 的内容传递到 20H~27H单元。 18、MOV 27H,R7

MOV 26H,R6 MOV 25H,R5 MOV 24H,R4 MOV 23H,R3 MOV 22H,R2 MOV 21H,R1 MOV 20H,R0

19,试编写程序,将内部RAM 20H、21H和22H3个连续单元的内容依次存入 2FH、2EH 和2DH 中。 19、MOV 2FH,20H MOV 2EH,21H MOV 2DH,22H

20,编写程序,进行两个16位数减法,6F5DH – 13B4H, 结果存入内部RAM

3

的30H和31H单元,30H存储低8位。 20、CLR C

MOV A,#5DH ;被减数的低8位→A MOV R2,#0B4H ;减数低8位→R2

SUBB A,R2 ;被减数减去减数,差→A MOV 30H,A ;低8位结果→30H MOV A,#6FH ;被减数的高8位→A MOV R2,#13H ;减数高8位→R2

SUBB A,R2 ;被减数减去减数,差→A MOV 31H,A ;高8位结果→30H

注意:如果在你的程序中用到了进位位,在程序开始的时候要记得清0进位位

21,编写程序,若累加器A的内容分别满足下列条件,则程序转至LABEL存储单元。设A中存储的是无符号数。(1)A≥10; (2)A>10; (3)A≤10。 21、(1)A≥10

CJNE A,#0AH,L1 ;(A)与10比较,不等转L1 LJMP LABEL ;相等转LABEL L1:JNC LABEL ;(A)大于10,转LABEL 或者: CLR C

SUBB A,#0AH JNC LABEL

(2)A>10

CJNE A,#0AH,L1 ;(A)与10比较,不等转L1 RET ;相等结束 L1:JNC LABEL ;(A)大于10,转LABEL RET ;(A)小于10,结束 或者:

CLR C

SUBB A,#0AH JNC L1 RET

L1:JNZ LABEL

RET

(3)A≤10

CJNE A,#0AH,L1 ;(A)与10比较,不等转L1 L2:LJMP LABEL ;相等转LABEL L1:JC L2 ;(A)小于10,转L2

RET 或者:

CLR C

SUBB A,#0AH

4

JC LABEL JZ LABEL RET

22,已知 (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 ;数据块长度→R2 MOV R0,#20H ;数据块首地址→R0 LOOP:MOV A,@R0 ;待查找的数据→A CLR C ;清进位位

SUBB A,#0AAH ;待查找的数据是0AAH吗 JZ L1 ;是,转L1

INC R0 ;不是,地址增1,指向下一个待查数据 DJNZ R2,LOOP ;数据块长度减1,不等于0,继续查找 MOV 51H,#00H ;等于0,未找到,00H→51H RET

L1:MOV 51H,#01H ;找到,01H→51H RET

26,编写指令,查找在内部RAM的20H~50H单元中出现00H的次数,并将查找结果存入51H单元。

26、 MOV R2,#31H ;数据块长度→R2 MOV R0,#20H ;数据块首地址→R0 LOOP:MOV A,@R0 ;待查找的数据→A JNZ L1 ;不为0,转L1

INC 51H ;为0,00H个数增1

L1:INC R0 ;地址增1,指向下一个待查数据

5

DJNZ R2,LOOP ;数据块长度减1,不等于0,继续查找 RET 27,外部数据RAM中有一个数据块,存有若干字符、数字,首地址为SOURCE。要求将该数据块传送到内部RAM以DIST开始的区域,直到遇到字符“$”时结束(“$”也要传送,它的ASCII码是24H)。

27、 MOV DPTR,#SOURCE ;源首地址→DPTR MOV R0,#DIST ;目的首地址→R0 LOOP:MOVX A,@DPTR ;传送一个字符 MOV @R0,A

INC DPTR ;指向下一个字符 INC R0

CJNE A,#24H,LOOP ;传送的是“$”字符吗?不是,传送下一个字符 RET

28,已知R3和R4中存有一个16位的二进制数,高位在R3中,低位在R4中。请编程将其求补,并存回原处。

28、 MOV A,R3 ;取该数高8位→A ANL A,#80H ;取出该数符号判断 JZ L1 ;是正数,转L1

MOV A,R4 ;是负数,将该数低8位→A CPL A ;低8位取反 ADD A,#01H ;加1

MOV R4,A ;低8位取反加1后→R4 MOV A,R3 ;将该数高8位→A CPL A ;高8位取反

ADDC A,#00H ;加上低8位加1时可能产生的进位 SETB ACC.7

MOV R3,A ;高8位取反加1后→R3 L1: RET

29,已知30H和31H中存有一个16位的二进制数,高位在前,地位在后,请编程将它们乘以2,再存回原单元中。 29、 CLR C ;清进位位C

MOV A,31H ;取该数低8位→A RLC A ;带进位位左移1位 MOV 31H,A ;结果存回31H MOV A,30H ;取该数高8位→A RLC A ;带进位位左移1位 MOV 30H,A ;结果存回30H

30,内存中有两个4字节以压缩的BCD码形式存放的十进制数,一个存放在30H~33H单元中,一个存放在40H~43H单元请编程求他们的和,结果存放在

6

30H~33H单元中。

30、 MOV R2,#04H ;字节长度→R2 MOV R0,#30H ;一个加数首地址→R0 MOV R1,#40H ;另一个加数首地址→R1 CLR C ;清进位位 LOOP:MOV A,@R0 ;取一个加数

ADDC A,@R1 ;两个加数带进位位相加 DA A ;十进制调整 MOV @R0,A ;存放结果

INC R0 ;指向下一个字节 INC R1 ;

DJNZ R2,LOOP ;数据块长度减1,不等于0,继续查找 RET

31,编写程序,将片外RAM从2000H开始存放的8个数传送到片内30H开始的单元中。

31、 MOV R2,#08H ;数据块长度→R2 MOV R0,#30H ;数据块目的地址→R0

MOV DPTR,#2000H ;数据块源地址→DPTR LOOP:MOVX A,@ DPTR ;传送一个数据 MOV @R0,A

INC DPTR ;指向下一个数据 INC R0 ;

DJNZ R2,LOOP ;数据块长度减1,没传送完,继续传送 RET

32,要将片内RAM中0FH单元的内容传送到寄存器B,对0FH单元的内容寻址可以有3种方法:(1)R寻址;(2)R间址;(3)direct寻址。 请分别编出相应程序,比较其字节数、机器周期数和优缺点。 32、(1)MOV R0,0FH ;2字节,2周期 4字节4周期(差) MOV B,R0 ;2字节,2周期

(2)MOV R0,#0FH ;2字节,1周期 4字节3周期(中) MOV B,@R0 ;2字节,2周期

(3)MOV B,#0FH ;3字节,2周期 3字节2周期(好)

33,阅读下列程序,要求:(1)说明该程序功能;(2)填写所缺的机器码;(3)修改程序,使片内RAM的内容成为如图3-20所示的结果。 7A - MOV R2,#0AH - - MOV R0,#50H E4 CLR A F6 LOOP: MOV @R0,A 08 INC R0 DA - DJNZ R2,LOOP DONE:

7

33、(1)功能是将片内RAM中50H~51H单元清0。

(2)7A0A (大家可以看一下书上,对于立即数寻址的话,后面一个字节存放的是立即数) 7850 (第一个字节的后三位是寄存器,前一个条指令是010也就是指的R2,在这里是R0,所以应该是78,后一个字节存放的是立即数) DAFC (这里涉及到偏移量的计算,可以参考书上56页) 34,设(R0)=7EH, (DPTR)=10FEH, 片内RAM中7EH单元的内容为0FFH, 7FH单元内容为38H, 试为下列程序每条指令注释其执行结果。 34、 INC @R0 ;(7EH)=00H INC R0 ;(R0)=7FH INC @R0 ;(7FH)=39H INC DPTR ;(DPTR)=10FFH INC DPTR ;(DPTR)=1100H INC DPTR ;(DPTR)=1101H

35,下列程序段经汇编后,从1000H开始的各有关存储单元内容将是什么? ORG 1000H TAB1:EQU 1234H TAB2:EQU 3000H DB “START” DW TAB1,TAB2,70H 35、解:(1000H)=53H (1001H)=54H (1002H)=41H (1003H)=52H (1004H)=54H (1005H)=12H (1006H)=34H (1007H)=30H (1008H)=00H (1009H)=70H

36:,阅读下列程序,并要求:(1)说明程序的功能;(2)写出涉及的寄存器及片内RAM单元(如图3-21所示)的最后结果。 36、MOV R0,#40H ;40H→R0

MOV A,@R0 ;98H→A INC R0 ;41H→R0

ADD A,@R0 ;98H+(41H)=47H→A INC R0

MOV @R0,A ;结果存入42H单元 CLR A ;清A

ADDC A,#0 ;进位位存入A INC R0

MOV @R0,A ;进位位存入43H

功能:将40H,41H单元中的内容相加结果放在42H单元,进位放在43H单元,(R0)=43H,(A)=1,(40H)=98H,(41H)=AFH,(42H)=47H,(43H)=01H

37,要求同上题,程序如下:

37、 MOV A,61H ;F2H→A

8

MOV B,#02H ;02H→B

MUL AB ;F2H×O2H=E4H→A ADD A,62H ;积的低8位加上CCH→A MOV 63H,A ;结果送62H CLR A ;清A

ADDC A,B ;积的高8位加进位位→A MOV 64H,A ;结果送64H

功能:将61H单元的内容乘2,低8位再加上62H单元的内容放入63H,将结果的高8位放在64H单元。(A)=02H,(B)=01H,(61H)=F2H,(62H)=CCH,(63H)=B0H,(64H)=02H

39,编写程序,采用“或”运算,使任意8位二进制数的符号位必为1。 39、MOV A,XXH

ORL A,#80H MOV XXH,A

40,请思考,采用“异或”运算,怎样可使一带符号数的符号位改变,数据位不变,怎样可使该数必然变为0 。 40、(2)MOV A,XXH MOV R0,A XRL A,R0

9