《微机原理与接口技术》习题解答3.docx
- 文档编号:24349078
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:16
- 大小:23.18KB
《微机原理与接口技术》习题解答3.docx
《《微机原理与接口技术》习题解答3.docx》由会员分享,可在线阅读,更多相关《《微机原理与接口技术》习题解答3.docx(16页珍藏版)》请在冰豆网上搜索。
《微机原理与接口技术》习题解答3
习题3
3.1简要分析8086的指令格式由哪些部分组成,什么是操作码?
什么是操作数?
寻址和寻址方式的含义是什么?
8086指令系统有哪些寻址方式?
【解答】8086的指令格式由操作码和操作数字段组成。
操作码:
要完成的操作。
操作数:
参与操作的对象。
寻址:
寻找操作数或操作数地址的过程。
寻址方式:
指令中给出的找到操作数或操作数地址采用的方式。
8086指令系统的寻址方式主要有立即数寻址、寄存器寻址、存储器寻址和I/O端口寻址。
其中,存储器寻址可进一步分为直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址、相对基址变址寻址;I/O端口指令IN和OUT使用的端口寻址方式有直接寻址和间接寻址。
3.2设(DS)=2000H,(ES)=2100H,(SS)=1500H,(SI)=00A0H,(BX)=0100H,(BP)=0010H,数据变量VAL的偏移地址为0050H,请指出下列指令的源操作数字段是什么寻址方式?
它的物理地址是多少?
(1)MOVAX,21H
(2)MOVAX,BX
(3)MOVAX,[1000H]
(4)MOVAX,VAL
(5)MOVAX,[BX]
(6)MOVAX,ES:
[BX]
(7)MOVAX,[BP]
(8)MOVAX,[SI]
(9)MOVAX,[BX+10]
(10)MOVAX,VAL[BX]
(11)MOVAX,[BX][SI]
(12)MOVAX,VAL[BX][SI]
【解答】
(1)MOVAX,21H
立即寻址,源操作数直接放在指令中
(2)MOVAX,BX
寄存器寻址,源操作数放在寄存器BX中
(3)MOVAX,[1000H]
直接寻址,EA=1000H,PA=(DS)×10H+EA=2000H×10H+1000H=21000H
(4)MOVAX,VAL
直接寻址,EA=[VAL]=0050H,PA=(DS)×10H+EA=2000H×10H+0050H=20050H
(5)MOVAX,[BX]
寄存器间接寻址,EA=(BX)=0100H,PA=(DS)×10H+EA=2000H×10H+0100H=20100H
(6)MOVAX,ES:
[BX]
寄存器间接寻址,EA=(BX)=0100H,PA=(ES)×10H+EA=2100H×10H+0100H=21100H
(7)MOVAX,[BP]
寄存器间接寻址,EA=(BP)=0010H,PA=(SS)×10H+EA=1500H×10H+0010H=15010H
(8)MOVAX,[SI]
寄存器间接寻址,EA=(SI)=00A0H,PA=(DS)×10H+EA=2000H×10H+00A0H=200A0H
(9)MOVAX,[BX+10]
相对寄存器寻址,EA=(BX)+10D=0100H+000AH=010AH,PA=(DS)×10H+EA=2000H×10H+010AH=2010AH
(10)MOVAX,VAL[BX]
相对寄存器寻址,EA=(BX)+[VAL]=0100H+0050H=0150H,PA=(DS)×10H+EA=2000H×10H+0150H=20150H
(11)MOVAX,[BX][SI]
基址变址寻址,EA=(BX)+(SI)=0100H+00A0H=01A0H,PA=(DS)×10H+EA=2000H×10H+01A0H=201A0H
(12)MOVAX,VAL[BX][SI]
相对基址变址寻址,EA=(BX)+(SI)+[VAL]=0100H+00A0H+0050H=01F0H,PA=(DS)×10H+EA=2000H×10H+01F0H=201F0H
3.3给定寄存器及存储单元的内容为:
(DS)=2000H,(BX)=0100H,(SI)=0002H,(20100)=32H,(20101)=51H,(20102)=26H,(20103)=83H,(21200)=1AH,(21201)=B6H,(21202)=D1H,(21203)=29H。
试说明下列各条指令执行完后,AX寄存器中保存的内容是什么。
(1)MOVAX,1200H
(2)MOVAX,BX(3)MOVAX,[1200H]
(4)MOVAX,[BX](5)MOVAX,1100H[BX](6)MOVAX,[BX][SI]
【解答】
(1)MOVAX,1200H;执行后,(AX)=1200H
(2)MOVAX,BX;执行后,(AX)=(BX)=0100H
(3)MOVAX,[1200H]
直接寻址,EA=[VAL]=1200H,PA=(DS)×10H+EA=2000H×10H+1200H=21200H,执行后,(AX)=B61AH
(4)MOVAX,[BX]
EA=(BX)=0100H,PA=(DS)×10H+EA=2000H×10H+0100H=20100H,执行后,(AX)=5132H
(5)MOVAX,1100H[BX]
EA=(BX)+1100H=0100H+1100H=1200H,PA=(DS)×10H+EA=2000H×10H+1200H=21200H,执行后,(AX)=B61AH
(6)MOVAX,[BX][SI]
EA=(BX)+(SI)=0100H+0002H=0102H,PA=(DS)×10H+EA=2000H×10H+0102H=20102H,执行后,(AX)=29D1H
3.4分析下列指令的正误,对于错误的指令要说明原因并加以改正。
(1)MOVAH,BX
(2)MOV[BX],[SI]
(3)MOVAX,[SI][DI]
(4)MOVMYDAT[BX][SI],AX
(5)MOVBYTEPTR[BX],1000
(6)MOVBX,OFFSETMAYDAT[SI]
(7)MOVCS,AX
(8)MOVDS,BP
【解答】
(1)MOVAH,BX
错误,寄存器类型不匹配,可改为MOVAX,BX
(2)MOV[BX],[SI]
错误,两个操作数不能都为存储单元,可改为MOVBX,[SI]或MOV[BX],SI
(3)MOVAX,[SI][DI]
错误,寻址方式中只能出现一个变址寄存器,可改为MOVAX,[BX][DI]。
(4)MOVMYDAT[BX][SI],ES:
AX
错误,AX签不能有段跨越前缀,去掉ES:
,改为MOVMYDAT[BX][SI],AX
(5)MOVBYTEPTR[BX],1000
错误,1000超出字节空间存储范围
(6)MOVBX,OFFSET[SI];正确
(7)MOVCS,AX
错误,MOV指令CS不能做目的操作数,可改为MOVDS,AX
(8)MOVDS,AX;正确
注:
本题错误改正部分有的答案并不唯一,可参考原题题意改成合法形式。
3.5设VAR1、VAR2为字变量,LAB为标号,分析下列指令的错误之处并加以改正。
(1)ADDVAR1,VAR2
(2)MOVAL,VAR2
(3)SUBAL,VAR1(4)JMPLAB[SI]
(5)JNZVAR1(6)JMPNEARLAB
【解答】
(1)ADDVAR1,VAR2
错误,两个操作数不能都为存储单元,可改为MOVBX,VAR2
ADDVAR1,BX
(2)MOVAL,VAR2
错误,数据类型不匹配,可改为MOVAX,VAR2
(3)SUBAL,VAR1
错误,数据类型不匹配,可改为SUBAX,VAR1
(4)JMPLAB[SI]
错误,寄存器相对寻址形式中不能用标号做位移量,可改为JMPVAR1[SI]
(5)JNZVAR1
错误,条件跳转指令只能进行段内短跳转,所以后面只能跟短标号。
可改为JNZLAB
(6)JMPNEARLAB
错误,缺少运算符PTR,可改为JMPNEARPTRLAB
注:
本题错误改正部分有的答案并不唯一,可参考原题题意改成合法形式。
3.6写出能够完成下列操作的8086CPU指令。
(1)把4629H传送给AX寄存器;MOVAX,4629H
(2)从AX寄存器中减去3218H;SUBAX,3218H
(3)把BUF的偏移地址送入BX中。
LEABX,BUF
【解答】
(1)MOVAX,4629H
(2)SUBAX,3218H
(3)LEABX,BUF
3.7根据以下要求写出相应的汇编语言指令。
(1)把BX和DX寄存器的内容相加,结果存入DX寄存器中;ADDDX,BX
(2)用BX和SI的基址变址寻址方式,把存储器中的一个字节与AL内容相加,并保存在AL寄存器中;
ADDAL,[BX][SI]
(3)用寄存器BX和位移量21B5H的变址寻址方式把存储器中的一个字和(CX)相加,并把结果送回存储器单元中;
ADD[BX+21B5H],CX
(4)用位移量2158H的直接寻址方式把存储器中的一个字与数3160H相加,并把结果送回该存储器中;
MOVAX,3160H
ADDAX,[2158H]
MOV[2158H],AX
(5)把数25H与(AL)相加,结果送回寄存器AL中。
ADDAL,25H
【解答】
(1)ADDDX,BX
(2)ADDAL,[BX][SI]
(3)ADD21B5H[BX],CX
(4)ADDWORDPTR[2158H],3160H
(5)ADDAL,25H
3.8写出将首地址为BLOCK的字数组的第6个字送到CX寄存器的指令序列,要求分别使用以下几种寻址方式:
(1)以BX的寄存器间接寻址LEABX,BLOCK
MOVCX,[BX+10]
(2)以BX的寄存器相对寻址
(3)以BX、SI的基址变址寻址
LEABX,BLOCK
MOVSI,10
MOVCX,[BX][SI]
【解答】
(1)LEABX,BLOCK+10
MOVCX,[BX]
(2)LEABX,BLOCK
MOVCX,10[BX]
(3)LEABX,BLOCK
MOVSI,10
MOVCX,[BX][SI]
3.9执行下列指令后,AX寄存器中的内容是什么?
TABLEDB10,20,30,40,50
ENTRYDW3
……
MOVBX,OFFSETTABLE
ADDBX,ENTRY
MOVAX,[BX]
AX=
【解答】AX=3228H
3.10下面是将内存一字节数据高4位和低4位互换并放回原位置的程序,找出错误并改正。
DATASEGMENT
DD1DB23H
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEASI,OFFSETDD1
MOVAL,[SI]
MOVCL,4
RCRAL,CL
MOV[SI],AL
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
【解答】程序第8行错误:
LEASI,OFFSETDD1,应去掉OFFSET;
程序第10行错误:
RCRAL,CL,应使用ROR或ROL,改为RORAL,CL
3.11已知用寄存器BX作地址指针,自BUF所指的内存单元开始连续存放着3个无符号数字数据,编程序求它们的和,并将结果存放在这3个数之后。
【解答】参考程序如下:
LEABX,BUF
MOVAX,[BX]
ADDAX,[BX+2]
ADDAX,[BX+4]
MOV[BX+6],AX
3.12分析汇编语言源程序应该由哪些逻辑段组成?
各段的作用是什么?
语句标号和变量应具备哪3种属性?
【解答】汇编语言源程序应该由若干个逻辑段组成,可以有若干个数据段、代码段、堆栈段和附加数据段,至少要有一个代码段。
各段的作用如下:
(1)代码段用来存放程序和常数。
(2)数据段用于数据的保存。
(3)堆栈段用于保护数据,尤其在子程序调用、中断过程中进行现场信息保护。
(4)附加数据段用于数据的保存。
语句标号和变量应具备的3种属性:
段属性、偏移属性和类型属性。
3.13执行完下列程序后,回答指定的问题。
MOVAX,0
MOVBX,2
MOVCX,50
LP:
ADDAX,BX
ADDBX,2
LOOPLP
问:
(1)该程序的功能是。
(2)程序执行完成后,(AX)=。
【解答】
(1)完成0到100间所有偶数求和的功能。
(2)2550
3.14编写程序,计算下面函数的值。
【解答】
DATASEGMENT
XDW34
SDW?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,X;将X送到AX中
CMPAX,0;(AX)>0吗?
JLDOUB;是,转向doub
CMPAX,10;否,(ax)<10吗?
JLETRIB;是,转向trib
SALAX,1;否,乘以4
SALAX,1
JMPEXIT
DOUB:
SALAX,1;乘以2
JMPEXIT
TRIB:
SALAX,1;乘以3
ADDAX,X
EXIT:
MOVS,AX;保存结果
MOVAH,4CH;结束
INT21H
CODEENDS
ENDSTART
注意,在比较的过程中使用的是针对带符号数的跳转指令,χ应该看作带符号数。
程序中还用了移位指令代替了乘法指令。
3.15从键盘输入一系列字符,以回车符结束,编程统计其中非数字字符的个数。
【解答】
DATASEGMENT
BLOCKDB100DUP(?
)
COUNTDB?
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
MOVDL,0
LEASI,BLOCK
LP:
MOVAH,1
INT21H
CMPAL,0DH
JZEXIT
MOV[SI],AL
CMPAL,30H
JAENEXT
CMPAL,39H
JBENEXT
INCDL
NEXT:
INCSI
JMPLP
EXIT:
MOVCOUNT,DL
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
3.16已知在内存中从BLOCK单元起存放有20个带符号字节数据,统计其中负数的个数并放入COUNT单元。
【解答】
DATASEGMENT
BLOCKDB-7,1,12,-90,-70,34,-1,56,45,-12
DB-3,-4,23,0,12,11,-9,-8,67,-56
CNEQU$-BLOCK
COUNTDB?
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
MOVDL,0
LEASI,BLOCK
MOVCX,CN
LP:
MOVAL,[SI]
TESTAL,80H
JZNEXT
INCDL
NEXT:
INCSI
LOOPLP
MOVCOUNT,DL
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
3.17从键盘输入一个大写英文字母,将其转换为小写字母并显示出来,要求输入其它字符时,能够有出错提示信息。
【解答】
DATASEGMENT
MESSDB'INPUPERROR!
',0AH,0DH,'$'
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
MOVAH,01H
INT21H
CMPAL,'A'
JBERR
CMPAL,'Z'
JAERR
ADDAL,20H
MOVDL,AL
MOVAH,02H
INT21H
JMPEXIT
ERR:
MOVDX,OFFSETMESS
MOVAH,09H
INT21H
EXIT:
MOVAH,02H
INT21H
CODEENDS
ENDSTART
3.18比较宏指令与子程序,它们有何异同?
它们的本质区别是什么?
【解答】宏与子程序两者的相同之处在于都是用来处理在编程过程中多次使用的功能程序的方法,两者均能简化源程序。
两者的区别在于:
(1)宏调用通过宏指令名进行,汇编时,随时调用随时展开,并不简化目标程序;子程序调用是在程序执行期间执行CALL指令,代码只在目标程序中出现一次,所以也简化了目标程序。
(2)宏调用时的参数由汇编程序通过实参转换成形参的方式传递,具有很大的灵活性。
宏定义中允许设置若干形式参数代替数值、指令、寄存器、各种字符串等。
宏调用时可用程序所需要的实际参数来替换,使编程人员感觉非常灵活;而子程序的参数传递要麻烦得多。
(3)宏调用在汇编时完成,不需要额外的时间开销;子程序调用和子程序返回都需要时间,还涉及堆栈操作。
故若优先考虑速度,用宏指令;若优先考虑存储空间,用子程序。
3.19试定义将一位十六进制数转换为ASCII码的宏指令。
【解答】
HEXTOAMACRO
ANDAL,0FH
CMPAL,9
JNAHEXTOA1
ADDAL,7H
HEXTOA1:
ADDAL,30H
ENDM
3.20试定义一个字符串搜索宏指令,要求文本首地址和字符串首地址用形式参数。
【解答】
SCANCMACROADDRESS,CHAR1
MOVSI,ADDRESS
MOVAL,[SI]
MOVDI,CHAR1
REPNZSCASB
ENDM
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机原理与接口技术 微机 原理 接口 技术 习题 解答
![提示](https://static.bdocx.com/images/bang_tan.gif)