汇编语言与接口技术习题答案Word文档格式.docx
《汇编语言与接口技术习题答案Word文档格式.docx》由会员分享,可在线阅读,更多相关《汇编语言与接口技术习题答案Word文档格式.docx(69页珍藏版)》请在冰豆网上搜索。
操作数存放在指令规定的某个寄存器(如:
对于16位操作数,寄存器可以是AX,BX,CX,DX,SI,DL,SP或BP;
而对8位操作数,寄存器可以是AH,AL,BH,BL,CH,CL,DH或DL)中。
MOVAL,BH
MOVAX,CX
MOVEAX,EBP
(3)存储器寻址
操作数存放在存储器中,在寻址时要计算存储单元的有效地址,有效地址可以由以下四种成分组成:
⏹位移量:
是存放在指令中的一个8位、16位或32位的数;
⏹基址:
其值存放在基址寄存器中。
BX、BP、任何32位通用寄存器都可以作为基址寄存器使用;
⏹变址:
其值存放在变址寄存器中。
SI、DI、除ESP外的32位通用寄存器都可以作为基址寄存器使用;
⏹比例因子:
是80386及后继机型中新增寻址方式中的术语。
其值可为1、2、4、8。
根据计算有效地址EA方法不同,存储器寻址又分为:
1)直接寻址(directaddressing)
操作数的有效地址是指令的一部分,它与操作码一起存放在代码段中,默认操作数在数据段(DS)中,如果操作数定义在其它段中,则应在指令中指定段超越前缀。
EA=立即数
MOVAX,[200H]
2)寄存器间接寻址(registerindirectaddressing)
操作数的有效地EA存放在基址寄存器(BX或BP)或变址寄存器(DI或SI)中。
计算物理地址的缺省段仍然是SI、DI和BX为DS,BP为SS
EA=寄存器中的值
MOVAX,[BX]
MOVAX,[BP]
MOVAX,[SI]
MOVAX,[DI]
3)寄存器相对寻址(registerrelativeaddressing)
由指定的寄存器内容,加上指令中给出的8位或16位偏移量(当然要由一个段寄存器作为地址基准)作为操作数的偏移地址。
EA=基址或变址寄存器(BX、BP、DI、SI)±
8位或16位的位移量
寄存器相对寻址常用于存取表格或一维数组中的元素——把表格的起始地址作为位移量,元素的下标值放在间址寄存器中(或反之)。
MOVAX,[BX+2]
MOVAX,[BP+1]
MOVAX,[SI-1]
MOVAX,[DI-2]
MOVAX,[BX+2000H]
MOVAX,[BP+1000H]
MOVAX,[SI-1000H]
MOVAX,[DI-2000H]
4)基址变址寻址(base-plus-indexaddressing)
有效地址由基址寄存器(BP或BX)的内容加上变址寄存器(DI或SI)的内容形成。
如基址寄存器为BX时,与DS形成的物理地址指向数据段;
如基址寄存器为BP时,与SS形成的物理地址指向堆栈段。
EA=基址寄存器的内容+变址寄存器的内容
MOVAX,[BX+SI]
MOVAX,[BX+DI]
MOVAX,[BP+SI]
MOVAX,[BP+DI]
一条指令中同时使用基址寄存器或变址寄存器是错误的。
MOVCL,[BX+BP]或MOVAX,[SI+DI]均为非法指令。
5)基址变址相对寻址(base-plus-indexrelativeaddressing)
有效地址由基址寄存器(BP或BX)、变址寄存器(DI或SI)及相对偏移量形成。
缺省段的使用仍然是DS与BX组合,SS与BP组合。
EA=基址寄存器的内容+变址寄存器的内容±
MOVAX,[BX+SI+2]
MOVAX,[BX+DI+1]
MOVAX,[BP+SI-1]
MOVAX,[BP+DI-2]
MOVAX,[BX+SI+2000H]
MOVAX,[BX+DI+1000H]
MOVAX,[BP+SI-1000H]
MOVAX,[BP+DI-2000H]
6)比例变址寻址方式
有效地址为变址寄存器的内容乘以指令中指定的比例因子再加上位移量之和。
MOVEAX,[ESI×
4+100H]
7)基址比例变址寻址方式
有效地址为变址寄存器的内容乘以指令中指定的比例因子再加上基址寄存器的内容之和。
4+EBX]
8)相对基址比例变址寻址方式
有效地址为变址寄存器的内容乘以指令中指定的比例因子、加上基址寄存器的内容,再加上位移量之和。
4+EBX+8]
(4)隐含寻址
指令操作数是隐含的,在指令中未显式地指明。
例:
MULBL
指令隐含了被乘数AL及乘积AX。
类似的指令还有:
DIV、CBW、MOVS等。
(5)I/O端口寻址
直接端口寻址
端口地址用8位立即数(0-255)表示
例:
INAL,21H;
从I/O端口地址为21H的端口中读取数据送到AL中。
间接端口寻址
I/O端口地址事先存放在规定的DX寄存器中(0-65535)
MOVDX,0FF03H
OUTDX,AL;
将AL中的内容输出到地址由DX
;
内容所指定的端口中
2.指出下列指令的错误
(1)movcx,dL
(2)movip,ax
(3)moves,1234h(4)moves,ds
(5)moval,300(6)mov[sp],ax
(7)movax,bx+di(8)mov20h,ah
(1)字长不同
(2)不能给IP赋值
(3)立即数不能直接赋给段寄存器
(4)给段寄存器赋值一定需要累加器
(5)立即数300超过8位不能赋给8位寄存器AL
(6)SP不能作为间址寄存器寻址
(7)两个寄存器不能相加
(8)立即数不能作为目标操作数
本题主要考查在应用通用传送指令时,需要注意以下几项(以MOV指令为例):
(1)传送指令可传送8位数据,也可传送16位数据,具体取决于指令中涉及的寄存器是8位还是16位,也取决于立即数的形式。
例如:
MOVAX,[35AH]
;
传送DS段中偏移地址为35AH的字单元内容至AX
MOVBL,[35AH]
传送DS段中偏移地址为35AH的字节单元内容至BL
MOV[BP],WORDPTR18H;
传送16位数据0018H至SS段中两个单元
MOV[BP],BYTEPTR37H;
传送8位数据37H至SS段中一个单元
(2)传送指令中总是既含源操作数,又含目的操作数,两者之中至少有一个是用寄器来指出的,这可减少指令长度。
因此,一个立即数不能直接送直接寻址的内存单元。
交换指令(XCHG)两个操作数都不能是立即数。
MOVWORDPTR[1000H],32A8H
错误
MOVWORDPTR[BX],32A8H
正确
(3)传送指令不能在两个内存单元之间直接传送数据。
MOV[2000H],[35AH]
错误
MOVWORDPTR[BX],[8729H]
错误
(4)在传送指令中,寄存器既可以作为源操作数,也可以作为目的操作数,但CS寄存器不能作为目的操作数,换句话说,这个寄存器的值不能随意修改。
而IP寄存器既不能作源操作数,也不能作目的操作数。
MOVCS,[35AH]
MOVCS,AX
MOVAX,IP
MOVIP,WORDPTR[BX]
(5)用BX、SI、DI来间接寻址时,默认的段寄存器为DS,而用BP来间接寻址时,默认的段寄存器为SS。
例如:
对于MOVWORDPTR[BP],1000和MOVWORDPTR[BX],2000,设DS=3000H,SS=4000H,BX=5000H,BP=6000H,则前一条指令将立即数1000送到物理地址为46000H和46001H的两单元中,后一条指令将立即数2000送到物理地址为35000H和35001H的两单元中。
(6)8086系统规定,凡是遇到给SS寄存器赋值的传送指令时,系统会自动禁止外部中断,等到本条指令和下条指令执行后,又自动恢复对SS寄存器赋值前的中断开放状态。
这样做是为了允许程序员连续用两条指令分别对SS和SP寄存器赋值,同时又防止堆栈空间变动过程中出现中断。
了解这点后,就应该注意在修改SS和SP的指令之间不要插入其他指令。
例如,下述写法是错误的:
MOVSS,AX
MOVDL,38H
MOVAH,2
INT21H
MOVSP,BX
(7)除了一些直接影响FLAGS的指令(如POPF)外,一般传送指令不改变标志寄存器的内容。
(8)立即数不能直接送段寄存器DS、ES以及SS。
例如:
MOVDS,875BH
MOVAX,875BH
MOVDS,AX
正确
MOVWORDPTR[BX],32A8H
MOVES,[BX]
正确
实际上,上述几点中有些要求适于其它通用传送型指令,甚至也适合其他种类的指令,读者可在后面的学习中不断去总结和积累。
3.已知数字0~9对应的格雷码依次为:
18H,34H,05H,06H,09H,0AH,0CH,11H,12H,14H,它存在于以table为首地址(设为200H)的连续区域中。
对如下程序段的每条指令加上注释,说明每条指令的功能和执行结果。
Leabx,table
movaL,8
xlat
Leabx,table;
得到表首地址,放在寄存器BX中
movaL,8;
立即数8赋值给AL,即AL中存放的是相对于表首的偏移地址
xlat;
利用查表转换指令,实质是查找8的格雷码
结果是(AL)=12H
程序段的功能为:
把表首地址即200H赋给BX。
分析:
本题主要考查查表转换指令(XLAT)的应用。
指令功能:
AL←DS:
[BX+AL]。
用途:
用于查表(或对一维数组操作),表首地址的偏移地址在BX中,表长度可达256字节。
把BX的值作为内存字节数组首地址、下标为AL的数组元素的值传送给AL。
有两个隐含操作数BX和AL。
4.什么是堆栈?
它的工作原则是什么?
它的基本操作有哪两个?
对应哪两种指令?
堆栈是一段具有特殊存取规则的数据区,工作原则是先进后出(FILO),它有两种基本的操作即进栈和出栈,对应的指令伪PUSH和POP。
堆栈的应用很多,应用8086/8088系统堆栈时我们要注意下面几点:
⏹堆栈是向下生长的;
⏹工作原则是先进后出(FILO);
⏹有两种操作,即进栈和出栈,只能进行字操作,且是对准字;
⏹对应的逻辑地址是SS:
SP。
6.给出下列各条指令执行后AL的值,以及CF、ZF、SF、OF和PF的状态。
movaL,89h
addaL,aL
addal,9dh
cmpaL,0bch
subaL,aL
decaL
incaL
MOVAL,89H;
(AL)=89H各状态标志位不变
ADDAL,AL;
(AL)=12HCF=1ZF=0SF=0OF=1PF=1
ADDAL,9DH;
(AL)=AFHCF=0ZF=0SF=1OF=0PF=1
CMPAL,0BCH;
(AL)=AFHCF=1ZF=0SF=0OF=0PF=0
SUBAL,AL;
(AL)=0HCF=0ZF=1SF=0OF=0PF=1
DECAL;
(AL)=FFHCF=0(不影响CF)ZF=0SF=0OF=1PF=1
INCAL;
(AL)=0HCF=0(不影响CF)ZF=1SF=0OF=1PF=1
本题主要考查指令对标志位的影响,总结如下。
(1)数据传送指令除了几个专门给标志寄存器赋值的指令(如:
POPF,SAHF等)外,对标志位都没有影响。
(2)算术运算指令中除了DEC和INC不影响CF外,其他算术指令对6个状态标志位都有影响。
(3)逻辑运算指令中,NOT不影响标志位,其它四种指令将使CF=OF=0,AF无定义,而SF、ZF和PF则根据运算结果而定。
以上详细情况请参考教材。
12.编写程序段完成如下要求:
(1)用位操作指令实现AL(无符号数)乘以10。
(2)用逻辑运算指令实现数字0~9的ASCII码与非压缩BCD码的互相转换。
(3)把DX.AX中的双字右移4位。
(1)参考答案:
MOVBL,AL
MOVCL,3
SHLAL,CL;
AL×
8
SHLBL,1;
2
ADDAL,BL;
8+AL×
2=AL×
10
本题主要考察用移位指令实现乘除法
1)算术移位(SAL/SAR)——把操作数看做有符号数;
逻辑移位(SHL/SHR)——把操作数看做无符号数。
2)移位位数放在CL寄存器中,如果只移1位,也可以直接写在指令中。
MOVCL,4
SHRAL,CL;
AL中的内容右移4位
3)影响C,P,S,Z,O标志。
4)结果未溢出时:
左移1位≡操作数×
右移1位≡操作数/2
5)用移位操作代替乘除法可提高运算速度。
在编写汇编程序的时候,应该注意程序的执行效率,使程序得到最大程度的优化,特别是在处理海量数据的时候,这就变得非常必要。
移位指令作为系统指令的一部分,可以在一定程度上帮助我们实现复杂的数值运算,而不会增加系统负担,这是非常有意义的。
计算x*10。
采用乘法指令:
MOVBL,10
MULBL
共需70-77个T周期。
采用移位和加法指令:
SALAL,1;
2T
MOVAH,AL;
2T
ADDAL,AH;
3T
只需11个T周期,仅相当于乘法指令的1/7。
(2)参考答案:
ASCII码转换成非压缩型BCD码的指令是:
ANDAL,0FH
非压缩型BCD转换成ASCII码的指令是:
ORAL,30H
根据ASCII码与BCD码的特点:
1)0~9的ASCII码为30H~39H;
2)0~9非压缩型BCD码为0H~9H。
又根据或(OR)指令和与(AND)指令的特点:
1)任何数和1相或(OR)结果都得1;
2)任何数和0相与(AND)结果都得0。
(3)参考答案:
MOVBX,DX
ANDBX,0FH
MOVCL,12
SHLBX,CL
MOVCL,4
SHRDX,CL
SHRAX,CL
ORAX,BX
实现32位数据逻辑右移,要注意高字的低位移到低字的高位。
14.已知数据段500H~600H处存放了一个字符串,说明下列程序段执行后的结果。
movsi,600h
movdi,601h
movax,ds
Moves,ax
movcx,256
std
repmovsb
把500H~600H处的256个字节的字符串顺序存放到偏移地址601H的地方。
本题和15题都在考查串操作指令的应用。
串操作类指令可以用来实现内存区域的数据串操作。
这些数据串可以是字节串,也可以是字串。
(1)重复指令前缀
串操作类指令可以与重复指令前缀配合使用。
从而可以使操作得以重复进行,及时停止。
重复指令前缀的几种形式见表3-1所示。
表3-1重复前缀
汇编格式
执行过程
影响指令
REP
(1)若(CX)=0,则退出;
(2)CX=CX-1;
(3)执行后续指令;
(4)重复
(1)-(3)
MOVS,STOS,LODS
REPE/
REPZ
(1)若(CX)=0或ZF=0,则退出;
CMPS,SCAS
REPNE/
REPNZ
(1)若(CX)=0或ZF=1,则退出;
(2)串操作指令
串操作指令共有五种,具体见表3-2。
对串指令要注意以下几个问题:
⏹各指令所使用的默认寄存器是:
SI(源串地址),DI(目的地址),CX(字串长度),AL(存取或搜索的默认值)。
⏹源串在数据段,目的串在附加段。
⏹方向标志与地址指针的修改。
DF=1,则修改地址指针时用减法;
DF=0时,则修改地址指针时用加法。
⏹MOVS、STOS、LODS指令不影响标志位。
表3-2串操作指令
功能
指令格式
执行操作
串传送
MOVSDST,SRC
MOVSB
MOVSW
由操作数说明是字节或字操作;
其余同MOVSB或MOVSW
[(ES:
DI)]←[(DS:
SI)];
SI=SI±
1,DI=DI±
1;
2,DI=DI±
2;
串比较
CMPSDST,SRC
CMPSB
CMPSW
其余同CMPSB或CMPSW
DI)]-[(DS:
串搜索
SCASDST
SCASB
SCASW
其余同SCASB或SCASW
AL-[(ES:
DI)]];
DI=DI±
AX-[(ES:
DI)];
存串
STOSDST
STOSB
STOSW
其余同STOSB或STOSW
AL→[(ES:
AX→[(ES:
取串
LODSSRC
LODSB
LODSW
其余同LODSB或LODSW
[(DS:
SI)]]→AL;
SI)]→AX;
17.控制转移类指令中有哪几种寻址方式?
控制转移类指令中的寻址方式主要有:
(1)段内直接寻址;
(2)段内间接寻址;
(3)段间直接寻址;
(4)段间间接寻址。
题17~题22都是在考查与转移地址有关的寻址方式。
与数据有关的寻址方式最终确定的是一个数据的地址,而与转移地址有关的寻址方式最终确定一条指令的地址。
有三种表示转移距离的操作符:
(1)SHORT转移,称为短转移,位移量用一个字节(8位)来表示。
(2)NEAR转移,称为近转移,位移量用16位表示,因为程序控制仍然在当前代码段,所以只修改IP的值,CS的值不变。
(3)FAR转移,称为远转移,因为程序控制超出了当前代码段,所以CS和IP都必须修改为新的值。
几种转移方式可以描述为:
(1)段内直接寻址
这种寻址方式在指令中直接指出转向地址,如:
JMPSHORTNEXT
JMPNEARPTRAGAIN
其中,NEXT和AGAIN均为转向的符号地址。
在机器指令中,操作码之后给出的是相对于当前IP值的位移量(转移距离),所以,转向的有效地址是当前IP值与指令中给出的位移量(8位或16位)之和。
注:
这种寻址方式适用于条件转移及无条件转移指令,当用于条件转移指令时,位移量只允许8位。
例如:
已知(DS)=2000H,(BX)=1256H,(SI)=528FH,
位移量=20A1H,(232F7H)=3280H,(264E5H)=2450H。
则执行JMPBX指令后
(IP)=1256H
执行JMP[BX][SI]指令后
(IP)=(16d×
(DS)+(BX)+(SI))
=(20000H+1256H+528FH)
=(264E5H)
=2450H
(2)段内间接寻址
这种寻址方式在指令中用数据寻址方式(除立即寻址方式外)间接地指出转向地址,如:
JMPBX
JMPNEARPTR[BX]
JMPTABLE[SI]