汇编语言与接口技术习题答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第3章 80X86的指令系统和寻址方式
本章主要讲授:80X86的数据类型、寻址方式、指令格式、指令系统(数据传送指令、算术运算指令、逻辑运算指令、串操作数指令、控制转移指令、处理机指令和高级语言指令)和80486指令等。
通过本章的学习,注意下面几方面的内容:
一、掌握80X86的数据类型;
二、掌握80X86的寻址方式;
三、掌握80X86的指令系统及它们的一些使用实例。
四、了解保护属性检查指令、高级语言指令以及Cache管理指令等。
习题精解
1.已知DS=2000H,BX=0100H,SI=0002H,存储单元[20100H]~[20103H]依次存放12 34
56 78H,[21200H]~[21203H]依次存放2A 4C B7 65H,说明下列每条指令执行后AX寄
存器的内容。
(1)MOV AX,1200H
(2)MOV AX,BX
(3)MOV AX,[1200H]
(4)MOV AX,[BX]
(5)MOV AX,[BX+1100H]
(6)MOV AX,[BX + SI]
(7)MOV AX,[BX][SI+1100H]
参考答案:
根据物理地址形成公式:物理地址=段基址×16+有效地址,得:
(1)1200H
(2)0100H
(3)4C2AH
(4)3412H
(5)4C2AH
(6)7856H
(7) 65B7H
分析:本题主要考查点是数据寻址方式,寻址方式就是指令中用于说明操作数所在地址的方法,或者是寻找操作数有效地址的方法。
包括数据寻址和转移地址寻址两大类。
80X86的数据寻址方式总结如下:
(1) 立即寻址方式
操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式就称为立即数寻址方式。
注:1、使用立即寻址的指令主要用来给寄存器赋初值,并且只能用于源操作数字段
2、不能直接给段寄存器和标志寄存器赋予立即数。
例: MOV AL,5
MOV AX,1234H
MOV EAX,12345678H
(2) 寄存器寻址方式
操作数存放在指令规定的某个寄存器(如:对于16位操作数,寄存器可以是AX,BX,CX,DX,SI,DL,SP或BP;而对8位操作数,寄存器可以是AH,AL,BH,BL,CH,CL,DH 或DL)中。
例:MOV AL,BH
MOV AX,CX
MOV EAX,EBP
(3) 存储器寻址
操作数存放在存储器中,在寻址时要计算存储单元的有效地址,有效地址可以由以下四种成分组成:
⏹位移量:是存放在指令中的一个8位、16位或32位的数;
⏹基址:其值存放在基址寄存器中。
BX、BP、任何32位通用寄存器都可以作
为基址寄存器使用;
⏹变址:其值存放在变址寄存器中。
SI、DI 、除ESP外的32位通用寄存器都
可以作为基址寄存器使用;
⏹比例因子:是80386及后继机型中新增寻址方式中的术语。
其值可为1、2、
4、8。
根据计算有效地址EA方法不同,存储器寻址又分为:
1)直接寻址(direct addressing)
操作数的有效地址是指令的一部分,它与操作码一起存放在代码段中,默认操作数在数据段(DS)中,如果操作数定义在其它段中,则应在指令中指定段超越前缀。
EA=立即数
例:MOV AX,[200H]
2)寄存器间接寻址(register indirect addressing)
操作数的有效地EA存放在基址寄存器(BX或BP)或变址寄存器(DI或SI)中。
计算物理地址的缺省段仍然是SI、DI和BX为DS,BP为SS
EA=寄存器中的值
例:MOV AX,[BX]
MOV AX,[BP]
MOV AX,[SI]
MOV AX,[DI]
3)寄存器相对寻址(register relative addressing)
由指定的寄存器内容,加上指令中给出的8位或16位偏移量(当然要由一个段寄存器作为地址基准)作为操作数的偏移地址。
EA =基址或变址寄存器(BX、BP、DI、SI)±8位或16位的位移量
注:寄存器相对寻址常用于存取表格或一维数组中的元素——把表格的起始地址作为位移量,元素的下标值放在间址寄存器中(或反之)。
例:MOV AX,[BX+2]
MOV AX,[BP+1]
MOV AX,[SI-1]
MOV AX,[DI-2]
MOV AX,[BX+2000H]
MOV AX,[BP+1000H]
MOV AX,[SI-1000H]
MOV AX,[DI-2000H]
4)基址变址寻址(base-plus-index addressing)
有效地址由基址寄存器(BP或BX)的内容加上变址寄存器(DI或SI)的内容形成。
如基址寄存器为BX时,与DS形成的物理地址指向数据段;如基址寄存器为BP时,与SS形成的物理地址指向堆栈段。
EA=基址寄存器的内容+变址寄存器的内容
例:MOV AX,[BX+SI]
MOV AX,[BX+DI]
MOV AX,[BP+SI]
MOV AX,[BP+DI]
注:一条指令中同时使用基址寄存器或变址寄存器是错误的。
例:MOV CL, [BX+BP] 或 MOV AX, [SI+DI] 均为非法指令。
5)基址变址相对寻址(base-plus-index relative addressing)
有效地址由基址寄存器(BP或BX)、变址寄存器(DI或SI)及相对偏移量形成。
缺省段的使用仍然是DS与BX组合,SS与BP组合。
EA=基址寄存器的内容+变址寄存器的内容±8位或16位的位移量
例:MOV AX,[BX+SI+2]
MOV AX,[BX+DI+1]
MOV AX,[BP+SI-1]
MOV AX,[BP+DI-2]
MOV AX,[BX+SI+2000H]
MOV AX,[BX+DI+1000H]
MOV AX,[BP+SI-1000H]
MOV AX,[BP+DI-2000H]
6)比例变址寻址方式
有效地址为变址寄存器的内容乘以指令中指定的比例因子再加上位移量之和。
例:MOV EAX,[ESI×4+100H]
7)基址比例变址寻址方式
有效地址为变址寄存器的内容乘以指令中指定的比例因子再加上基址寄存器的内容之和。
例:MOV EAX,[ESI×4+EBX]
8)相对基址比例变址寻址方式
有效地址为变址寄存器的内容乘以指令中指定的比例因子、加上基址寄存器的内容,再加上位移量之和。
例:MOV EAX,[ESI×4+EBX+8]
(4) 隐含寻址
指令操作数是隐含的,在指令中未显式地指明。
例:MUL BL
指令隐含了被乘数AL及乘积AX。
类似的指令还有:DIV、CBW、MOVS等。
(5)I/O端口寻址
直接端口寻址
端口地址用8位立即数(0-255)表示
例:IN AL,21H;从I/O端口地址为21H的端口中读取数据送到AL中。
间接端口寻址
I/O端口地址事先存放在规定的DX寄存器中(0-65535)
例:MOV DX,0FF03H
OUT DX,AL;将AL中的内容输出到地址由DX
;内容所指定的端口中
2.指出下列指令的错误
(1)MOV CX,DL (2)MOV IP,AX
(3)MOV ES,1234H (4)MOV ES,DS
(5)MOV AL,300 (6)MOV [SP],AX
(7)MOV AX,BX+DI (8)MOV 20H,AH
参考答案:
(1)字长不同
(2)不能给IP赋值
(3)立即数不能直接赋给段寄存器
(4)给段寄存器赋值一定需要累加器
(5)立即数300超过8位不能赋给8位寄存器AL
(6)SP不能作为间址寄存器寻址
(7)两个寄存器不能相加
(8)立即数不能作为目标操作数
分析:本题主要考查在应用通用传送指令时,需要注意以下几项(以MOV指令为例):(1)传送指令可传送8位数据,也可传送16位数据,具体取决于指令中涉及的寄存器是8
位还是16位,也取决于立即数的形式。
例如:
MOV AX,[35AH] ;传送DS段中偏移地址为35AH的字单元内容至AX
MOV BL,[35AH] ;传送DS段中偏移地址为35AH的字节单元内容至BL
MOV [BP],WORD PTR 18H ;传送16位数据0018H至SS段中两个单元
MOV [BP],BYTE PTR 37H ;传送8位数据37H至SS段中一个单元
(2)传送指令中总是既含源操作数,又含目的操作数,两者之中至少有一个是用寄器来指出
的,这可减少指令长度。
因此,一个立即数不能直接送直接寻址的内存单元。
交换指令(XCHG)两个操作数都不能是立即数。
例如: MOV WORD PTR [1000H],32A8H 错误
MOV WORD PTR [BX],32A8H 正确
(3)传送指令不能在两个内存单元之间直接传送数据。
例如: MOV [2000H],[35AH] 错误
MOV WORD PTR [BX],[8729H] 错误
(4)在传送指令中,寄存器既可以作为源操作数,也可以作为目的操作数,但CS寄存器不
能作为目的操作数,换句话说,这个寄存器的值不能随意修改。
而IP寄存器既不能作源操作数,也不能作目的操作数。
例如: MOV CS,[35AH] 错误
MOV CS,AX 错误
MOV AX,IP 错误
MOV IP,WORD PTR[BX] 错误
(5)用BX、SI、DI来间接寻址时,默认的段寄存器为DS,而用BP来间接寻址时,默认的段
寄存器为SS。
例如:对于MOV WORD PTR[BP],1000和MOV WORD PTR[BX],2000,设DS=3000H,SS=4000H,BX=5000H,BP=6000H,则前一条指令将立即数1000送到物理地址为46000H和46001H 的两单元中,后一条指令将立即数2000送到物理地址为35000H和35001H的两单元中。
(6)8086系统规定,凡是遇到给SS寄存器赋值的传送指令时,系统会自动禁止外部中断,
等到本条指令和下条指令执行后,又自动恢复对SS寄存器赋值前的中断开放状态。
这样做是为了允许程序员连续用两条指令分别对SS和SP寄存器赋值,同时又防止堆栈空间变动过程中出现中断。
了解这点后,就应该注意在修改SS和SP的指令之间不要插入其他指令。
例如,下述写法是错误的:
MOV SS,AX
MOV DL,38H
MOV AH,2
INT 21H
MOV SP,BX
(7)除了一些直接影响FLAGS的指令(如POPF)外,一般传送指令不改变标志寄存器的内容。
(8)立即数不能直接送段寄存器DS、ES以及SS。
例如: MOV DS,875BH 错误
MOV AX,875BH
MOV DS,AX 正确
MOV WORD PTR[BX],32A8H
MOV ES,[BX] 正确
实际上,上述几点中有些要求适于其它通用传送型指令,甚至也适合其他种类的指令,读者可在后面的学习中不断去总结和积累。
3.已知数字0~9对应的格雷码依次为:18H,34H,05H,06H,09H,0AH,0CH,11H,12H,14H,它存在于以TABLE为首地址(设为200H)的连续区域中。
对如下程序段的每条指令加上注释,说明每条指令的功能和执行结果。
LEA BX,TABLE
MOV AL,8
XLAT
参考答案:
LEA BX,TABLE ;得到表首地址,放在寄存器BX中
MOV AL,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的状态。
MOV AL,89H
ADD AL,AL
ADD AL,9DH
CMP AL,0BCH
SUB AL,AL
DEC AL
INC AL
参考答案:
MOV AL, 89H ;(AL)=89H 各状态标志位不变
ADD AL, AL ;(AL)=12H CF=1 ZF=0 SF=0 OF=1 PF=1
ADD AL, 9DH ;(AL)=AFH CF=0 ZF=0 SF=1 OF=0 PF=1
CMP AL, 0BCH ;(AL)=AFH CF=1 ZF=0 SF=0 OF=0 PF=0
SUB AL, AL ;(AL)=0H CF=0 ZF=1 SF=0 OF=0 PF=1
DEC AL ;(AL)=FFH CF=0(不影响CF) ZF=0 SF=0 OF=1 PF=1
INC AL ;(AL)=0H CF=0(不影响CF) ZF=1 SF=0 OF=1 PF=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)参考答案:
MOV BL, AL
MOV CL, 3
SHL AL, CL ;AL×8
SHL BL, 1 ;AL×2
ADD AL, BL ;AL×8+ AL×2= AL×10
分析:本题主要考察用移位指令实现乘除法
1)算术移位(SAL/SAR)——把操作数看做有符号数;
逻辑移位(SHL/SHR)——把操作数看做无符号数。
2)移位位数放在CL寄存器中,如果只移1位,也可以直接写在指令中。
例如: MOV CL,4
SHR AL,CL ;AL中的内容右移4位
3)影响C,P,S,Z,O标志。
4)结果未溢出时:
左移1位≡操作数×2
右移1位≡操作数/2
5)用移位操作代替乘除法可提高运算速度。
在编写汇编程序的时候,应该注意程序的执行效率,使程序得到最大程度的优化,特别是在处理海量数据的时候,这就变得非常必要。
移位指令作为系统指令的一部分,可以在一定程度上帮助我们实现复杂的数值运算,而不会增加系统负担,这是非常有意义的。
例:计算x*10。
采用乘法指令:
MOV BL,10
MUL BL
共需70-77个T周期。
采用移位和加法指令:
SAL AL,1 ; 2T
MOV AH,AL ; 2T
SAL AL,1 ; 2T
SAL AL,1 ; 2T
ADD AL,AH ; 3T
只需11个T周期,仅相当于乘法指令的1/7。
(2)参考答案:
ASCII码转换成非压缩型BCD码的指令是:
AND AL, 0FH
非压缩型BCD转换成ASCII码的指令是:
OR AL, 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)参考答案:
MOV BX, DX
AND BX, 0FH
MOV CL, 12
SHL BX, CL
MOV CL, 4
SHR DX, CL
SHR AX, CL
OR AX, BX
分析:实现32位数据逻辑右移,要注意高字的低位移到低字的高位。
14.已知数据段500H~600H处存放了一个字符串,说明下列程序段执行后的结果。
MOV SI,600H
MOV DI,601H
MOV AX,DS
MOV ES,AX
MOV CX,256
STD
REP MOVSB
参考答案:
把500H~600H处的256个字节的字符串顺序存放到偏移地址601H的地方。
分析:本题和15题都在考查串操作指令的应用。
串操作类指令可以用来实现内存区域的数据串操作。
这些数据串可以是字节串,也可以是字串。
(1)重复指令前缀
串操作类指令可以与重复指令前缀配合使用。
从而可以使操作得以重复进行,及时停止。
重复指令前缀的几种形式见表3-1所示。
表3-1重复前缀
(2)串操作指令
串操作指令共有五种,具体见表3-2。
对串指令要注意以下几个问题:
⏹各指令所使用的默认寄存器是:SI(源串地址),DI(目的地址),CX(字串长
度),AL(存取或搜索的默认值)。
⏹源串在数据段,目的串在附加段。
⏹方向标志与地址指针的修改。
DF=1,则修改地址指针时用减法;DF=0时,则
修改地址指针时用加法。
⏹MOVS、STOS、LODS指令不影响标志位。
表3-2 串操作指令
17.控制转移类指令中有哪几种寻址方式?
参考答案:
控制转移类指令中的寻址方式主要有:
(1)段内直接寻址;
(2)段内间接寻址;
(3)段间直接寻址;
(4)段间间接寻址。
分析:题17~题22都是在考查与转移地址有关的寻址方式。
与数据有关的寻址方式最终确定的是一个数据的地址,而与转移地址有关的寻址方式最终确定一条指令的地址。
有三种表示转移距离的操作符:
(1)SHORT转移,称为短转移,位移量用一个字节(8位)来表示。
(2) NEAR转移,称为近转移,位移量用16位表示,因为程序控制仍然在当前代码
段,所以只修改IP的值,CS的值不变。
(3) FAR转移,称为远转移,因为程序控制超出了当前代码段,所以CS和IP都必
须修改为新的值。
几种转移方式可以描述为:
(1)段内直接寻址
这种寻址方式在指令中直接指出转向地址,如:
JMP SHORT NEXT
JMP NEAR PTR AGAIN
其中,NEXT和AGAIN均为转向的符号地址。
在机器指令中,操作码之后给出的是相对于当前IP值的位移量(转移距离),所以,转向的有效地址是当前IP值与指令中给出的位移量(8位或16位)之和。
注:这种寻址方式适用于条件转移及无条件转移指令,当用于条件转移指令时,位移量只允许8位。
例如:已知(DS)= 2000H,(BX)= 1256H,(SI)= 528FH,
位移量 = 20A1H,(232F7H)= 3280H,(264E5H)= 2450H。
则执行 JMP BX指令后
(IP)= 1256H
执行JMP [BX][SI]指令后
(IP)=(16d ×(DS)+(BX)+(SI))
=(20000H + 1256H + 528FH)
=(264E5H)
= 2450H
(2)段内间接寻址
这种寻址方式在指令中用数据寻址方式(除立即寻址方式外)间接地指出转向地址,如:
JMP BX
JMP NEAR PTR [BX]
JMP TABLE[SI]
注意:这种寻址方式以及以下的两种段间寻址方式都不能用于条件转移指令。
(3)段间直接寻址
段间直接寻址和段内直接寻址类似,指令中直接给出转向地址,不同的是,在符号地址之前要加上表示段间远转移的操作符FAR PTR。
指令格式如下:
JMP FAR PTR OUTSEG
因为是段间转移,CS和IP都要更新,这个新的段地址和偏移地址由指令操作码之后的连续两个字提供,所以只要将指令中提供的转向偏移地址装入IP,转向段地址
装入CS,就完成了从一个段到另一个段转移的工作。
(4)段间间接寻址
这种寻址方式仍然是用相继两个字的内容装入IP和CS来达到段间的转移目的的,但这两个字的存储器地址是通过指令中的数据寻址方式(除立即寻址方式和寄存器寻址方式外)来取得的。
为了说明寻址两个字单元,指令中必须加上双字操作符DWORD。
指令格式如下:JMP DWORD PTR [SI]
JMP DWORD PTR[TABLE+BX]
另外,8086条件转移只能近转移,即其范围为-128~+127。
这种转移容易使用不慎超出范围而出错,解决办法:一般可以增加分支或改用长跳转指令。
23.假设AX和SI存放的是有符号数,DX和DI存放的是无符号数,请用比较指令和条件转移指令实现以下判断:
(1)若DX>DI,转到ABOVE执行;
(2)若AX>SI,转到GREATER执行;
(3)若CX=0,转到ZERO执行;
(4)若AX−SI产生溢出,转到OVERFLOW执行;
(5)若SI≤AX,转到LESS_EQ执行;
(6)若DI≤DX,转到BELOW_EQ执行。
参考答案:
(1) CMP DX, DI
JA ABOVE
(2) CMP AX, SI
JG GREATER
(3) CMP CX, 0
JE ZERO
(4) SUB AX, SI
JO OVERFLOW
(5) CMP SI, AX
JLE LESS_EQ
(6) CMP DI, DX
JBE BELOW_EQ
分析:本题主要考查比较指令,包括有符号数的比较和无符号数的比较。
比较指令主要用于比较两个数之间的关系。
在比较指令(CMP)后面常跟条件转移指令,根据比较结果不同产生不同的分支,总结如下:
1)相等的比较,根据ZF标志即可判断两者是否相等。
①若两者相等,相减以后结果为零,ZF标志为1,否则为0;
②若两者不相等,则可在比较指令之后利用其它标志位的状态来确定两者的大小。
2)大小的比较,分为有符号数的比较和无符号数的比较。
主要的条件转移指令及转移指令如表3-3所示。
表3-3 条件转移指令表
从表3-3可以看到,条件转移指令是根据两个数的比较结果或某些标志位的状态来决定转移的。
在条件转移指令中,有的根据对符号数进行比较和测试的结果实现转移。
这些指令通常对溢出标志位OF和符号标志位SF进行测试。
对无符号数而言,这类指令通常测试标志位CF。
对于带符号数,分大于、等于、小于3种情况;对于无符号数,分高于、等于、低于3种情况。
在使用这些条件转移指令时,一定要注意被比较数的具体情况及比较后所能出现的预期结果。
24.有一个首地址为ARRAY的20个字的数组,说明下列程序段的功能。
MOV CX,20
MOV AX,0
MOV SI,AX
SUM_LOOP:ADD AX,ARRAY[SI]
ADD SI,2
LOOP SUM_LOOP
MOV TOTAL,AX
参考答案:
该程序段的功能是把首地址ARRAY开始的20个字的数组相加,结果放到地址为TOTAL 的内存单元中。
分析:本题主要考查循环指令LOOP的应用
LOOP指令执行的操作是先把CX减1,再判断是不继续循环,当CX=0就不再循环。
注:重复前缀REP是先判断CX是不是0,然后决定是否继续循环。
例如:MOV CX, 0
REP MOVSB
则一次都不会循环,即不会执行MOVSB这条指令。
对于需要重复进行的操作,可用循环程序结构来进行,8086/8088系统为了简化程序设计,设置了一组循环指令,这组指令主要对CX或标志位ZF进行测试,确定是否循环,如表3-4所示。
表3-4 循环指令表
27.已知AX,BX存放的是4位压缩BCD表示的十进制数,请说明如下子程序的功能和出口参数。
ADD AL,BL
DAA
XCHG AL,AH
ADC AL,BH
DAA
XCHG AL,AH
RET
参考答案:
本程序的功能是把两个4位的十进制数相加,结果放在AX中。
分析:
本题和28题主要考查BCD码运算。
所谓BCD码是用二进制数的形式表示十进制数,又分为:压缩BCD码,即规定每个字节表示两位BCD数;非压缩BCD码,即用一个字节表示一位BCD数,在这字节的高四位用0填充。
例如,十进制数25D,表示为压缩BCD数时为:25H;
表示为非压缩BCD 数时为:0205H ,用两字节表示。
计算机中的算术运算,都是针对二进制数的运算,而人们在日常生活中习惯使用十进制。
在8086/8088系统中,为了避免出现非法的BCD 码(如A ~F )及调整计算机中二进制运算规则(逢2进1),对BCD 码(即十进制)算术运算有一类BCD 码调整指令,如表3-5所示。
注:BCD 码进行乘除法运算时,一律使用无符号数形式,因而AAM 和AAD 应固定地出现在MUL 之前和DIV 之后。
习题汇编 1.选择题
(1)寄存器间接寻址方式中,操作数处在( )。
A .通用寄存器 B .主存单元 C .程序计数器 D .堆栈
(2)若IMUL BL 指令执行后,CF=OF=1,(AL )=82H ,则表示( )。
A .(BL) > 0 B.(AH)=FF C.被乘数小于零 D.乘积大于128
(3)若(SS )=2000H,(SP)=0100H,(AX)=2107H,执行指令PUSH AX 后存放数据21H 的物理地址是( )。
A. 20102H
B.20101H
C.200FEH
D.200FFH (4)对于给定的数据定义
A1 DW 1, 2, 3, ‘AB' A2 DB 6 DUP(?) A3 DB 0 R1 EQU A3-A1
变量 R1 的值为 ( )。
A . 12
B . 18
C . 16
D . 14
(5)指令LOOPNZ 在循环中退出循环的条件是( )。
A . CX=0且ZF=0
B .CX=0或ZF=1
C . CX ≠0或ZF=0
D .CX ≠0且ZF=1 (6)汇编程序的数据段中定义了两个变量
A D
B 20H,21H B DW 22H
执行了MOV DX ,WORD PTR [A+1]后,DX 中的值为 ( )。
A .0021H B .2221H C .2122H D .0022H
(7)为使CX=-1时,转至标号MINUS 开始的指令序列,其中错误的序列是( )。
A .INC CX
表3-5 BCD 码调整指令
JZ MINUS
B.SUB CX,OFFFFH
JZ MINUS
C.AND CX,OFFFFH
JZ MINUS
D.XOR CX,OFFFFH
JZ MINUS
(8)执行下面指令序列后,结果是()。
MOV AL,72H
CBW
A.AX=0FF72H B.AX=8072H C.AX=0072H D.AX=0F72H
(9)执行下列三条指令
MOV SP,1000H
PUSH AX
CALL 2000:1000H
SP的内容为()。
A.(SP)=1000H B.(SP)=0FFEH C.(SP)=1004H D.(SP)=0FFAH (10)指令JMP SI 的目标地址偏移量为()。
A.SI的内容 B.SI所指向的内存字单元之内容
C.IP+[BX]之和 D.IP+[SI]
(11)设(AL)=0FFH,依次执行ADD AL,12和AND AL,0FH指令后,标志位ZF和SF的状态分别为()。
A.0和0 B.0和1 C.1和0 D.1和1
(12)若(BX)=1000H,(DS)=2000H,(21000H)=12H,(21001H)=34H,执行LEA SI,[BX]指令后,SI寄存器中的内容是()。
A.1234H B.3412H C.1000H D.0010H
2.简答题
(1)写出能完成下列任务的指令:
1)将12H送入AL;
2)将12H送入由BX所指出的内存单元;
3)将12H送入数据段内偏移地址为2000H的内存单元;
4)将CL的内容拷贝到BH中;
5)将23000H单元中的内容拷贝到AL中。
(2)假定初始情况 (DX)=0B9H, (CL)=3, (CF)=1,下列各条指令单独执行以后,DX的值分别是多少?
SHR DX, 1
SAR DX, CL
SHL DX, CL
SHL DX, 1
ROR DX, CL
ROL DX, CL
SAL DH, 1
RCL DX, CL
RCR DL, 1
(3)AL= 79H, BL = 97H,则以下指令执行以后,AL、CF和AF的结果如何?
ADD AL, BL
DAA
AL=( )、 CF=( ) 、AF=( )。
(4)设DS=1000H,BX=200H,SI=2H,(10200H)~(10205H)的内容为10H、2AH、3CH、46H、59H、6BH。
试问,下列每条指令单独执行完成后,AX寄存器的内容是什么?
MOV AX,0200H
MOV AX,[200H]
MOV AX,BX
MOV AX,3[BX]
MOV AX,[BX+SI]
MOV AX,2[BX+SI]
(5)请问下面程序段各循环多少次数?
1) MOV CX, 0
LOP: NOP
LOOP LOP
2) MOV CX, 0
REP MOVSB
(6)写出将AX寄存器清零的4种方法。
(7)试用指令实现:
1)AL 寄存器低 4 位清 0 ;
2)BL 寄存器低 4 位置 1 ;
3)CL 寄存器低 4 位取反;
4)测试 DL 寄存器的D2位是否为 0
(8)读下列程序段,对程序加以注释,并说出程序的功能;当AL=5BH,写出执行程序后AL 的值。
MOV BL,AL
MOV CX,8
AGAIN : ROL BL,1
RCR AL,1
LOOP AGAIN
(9)设(IP)=1234H,(CS)=4050H,(SP)=0F178H,当执行CALL 2000:009AH后,写出下列寄存器的内容。
(IP)=
(CS)=
(SP)=
[SP]=
[SP+1]=
[SP+2]=
[SP+3]=
(10)程序实现两位BCD码数转换成ASCII码,填写相关指令,完成程序功能。
BCD1 EQU 59H
BUF DB 2 DUP(?)
MOV AL,BCD1
MOV SI,0
MOV BL,AL
ADD AL,30H
MOV BUF[SI],AL
MOV CL,4
BL,CL
ADD BL,
MOV BUF[SI],BL
(11)读下面程序段,并回答执行下面的代码后, AL与BL的内容是什么?并说明该程序段的功能。
MOV AL, 12H
MOV BL, AL
AND AL, 0FH
OR AL, 30H
MOV CL, 4
SHR BL, CL
ADD BL, 30H
(12)如果堆栈的起始地址为2200:0000H,栈底为0100H,(SP)=00A8H,求1)栈顶地址;
2)SS的内容;
3)再存入数据5678H,3AF2H后,SP的内容。
(13)设(BX)=11001011B,变量VAR的内容为00110010B,求下列指令单独执行后BX的内容。
XOR BX,VAR
AND BX,VAR
OR BX,VAR
XOR BX,11110000B
AND BX,00001111B
TEST BX,1
(14)假设(EAX)=00002000H, (EBX)=00003000H,(DS)=0010H,问以下指令访问的内存实际物理地址是多少?
MOV ECX, [EAX+EBX]
MOV [EAX+3*EBX],CL
MOV AL, [EBX+2*EAX+200H]
(15)80X86的指令在形式上只给出了偏移地址,请问是如何确定当前的段寄存器的?(16)若在数据段0200H中有一个数,把它的前4位取反,后四位维持不变,再送回同一个地址单元中,请编程实现。
(17)已知SS=0FFA0H,SP=00B0H,先执行两条把8057H和0F79H分别进栈的PUSH指令,再
执行一条POP指令,试画出堆栈区和SP内容变化的过程示意图(标出存储单元的地址)。
(18)已知程序段如下:
MOV AX,1234H
MOV CL,4
ROL AX,CL
DEC AX
MOV CX,4
MUL CX
INT 20H
试问:1)每条指令执行后,AX寄存器的内容是什么?
2)每条指令执行后,CF,SF及ZF的值分别是什么?
3)程序运行结束时,AX及DX寄存器的值为多少?
第4章 80X86汇编语言程序设计
本章主要讲授MASM宏汇编语句结构以及开发过程、MASM汇编语言表达式和运算符、伪指令、分支程序设计、循环程序设计、子程序设计技术。
通过本章学习,应从以下几方面掌握和理解相关内容。
一、掌握MASM宏汇编语句结构以及开发过程。
掌握汇编、连接、调试的应用。
二、掌握MASM汇编语言表达式、运算符。
三、80X86的伪指令,包括数据定义伪指令、符号定义伪指令、段定义伪指令、过程定义伪
指令、结束伪指令等。
注意伪指令语句和指令语句的区别。
四、掌握复杂数据结构。
五、掌握掌握宏汇编。
六、掌握基本汇编语言程序设计,包括顺序结构、分支结构、循环结构及子程序的设计。
七、了解高级汇编语言程序设计。
习题精解
1.伪指令语句与硬指令语句的本质区别是什么? 伪指令有什么主要作用?
参考答案:
伪指令语句是一种不产生机器代码的语句,是说明性语句,是面向汇编程序和连接程序的。
如:定义变量,分配存储单元,指示程序开始和结束等。
硬指令是能产生机器代码,CPU可以执行的,能完成特定功能的语句,它主要由CPU 指令组成。
伪指令的作用:在汇编过程中,告诉汇编/连接程序如何汇编/连接。
2.什么是标识符,汇编程序中标识符怎样组成?
参考答案:
标识符是指由字母或数字组成的,且只以字母为开头的字母数字串。
汇编程序中标识符可由下列字符组成:
字母:A~Z ;数字:0~9 ;特殊字符:?、·、@、_、$ 。
数字不能作标识符的第一个字符,而圆点仅能用作第一个字符。
标识符最长为31个字符。
注:标识符不能用保留字(如寄存器名,指令助记符,伪指令)。
5.汇编语言程序的开发有哪4个步骤,分别利用什么程序完成,产生什么输出文件?
参考答案:
汇编语言程序开发有4个步骤:
源程序的编辑:利用文件编辑器,产生ASM源程序;
源程序的汇编:利用MASM完成,产生OBJ文件;
目标文件的连接:利用LINK连接程序,产生EXE文件、LST列表文件和MAP映像文件;。