版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
3.1概述3.280X86的寻址方式3.3指令格式3.480X86指令系统习题与思考题第3章80X86寻址方式和指令系统
3.1概述计算机的工作就是运行程序,而程序由存储在存储器中的指令序列构成。机器语言指令由二进制代码组成。指令语句一般由操作码(OC)和操作数(OD)两部分组成,指令的一般格式如下:操作码由便于记忆的助记符表示,操作码表示计算机执行什么操作;操作数可能指明了参与操作的数本身,或规定了操作数的地址。
8086/8088系统中一条指令的操作数可以是双操作数(源操作数和目的操作数),也可以是单操作数,有的指令还可以没有操作数或隐含操作数。80386/80486系统中的指令则有多个操作数。操作数主要分为三类:立即数:立即数即常数,是一个固定数值的操作数寄存器:寄存器操作数存放在CPU的某个寄存器中存储器操作数:存储器操作数则存放在内存的数据区中。
3.280X86的寻址方式在80X86系统中,寻址方式通常分为两种:一种为寻找操作数的地址,称为数据寻址;使用MOV指令来描述数据寻址模式,它可实现在寄存器之间,寄存器与存储器之间操作数的传送。一种为寻找要执行的下一条指令的地址,即程序转移或子程序调用时的目的地址或入口地址,称为程序转移地址寻址方式。使用JUMP及CALL指令表明了怎样更改程序流程。3.2.1数据的寻址方式数据的寻址方式一般针对源操作数而言,以通用传送指令MOVDST,SRC为例:SRC为源操作数,指令执行过程中原值保持不变;DST为目的操作数,原值不保留,MOV指令完成从源操作数向目的操作数拷贝数据的功能。1.立即寻址(ImmediateAddressing)
操作数包含在指令码中,由指令给出。立即操作数可以是常数,如果操作数以字母开头,汇编程序要求操作数在其前加0。例如:在汇编语言中以0A2H描述操作数A2H。
ASCII码字符也可用于描述立即数,例如:MOVAH,‘B’指令将ASCII码B所对应的数据42H放入寄存器AH中。立即寻址通常用于给寄存器赋值,并且只适用于源操作数字段,不能用于目的操作数字段,要求源操作数与目的操作数长度一致。立即数可以是8位或16位的。在80386及其后继机型中,立即数也可是32位操作数。【例3.1】MOVAL,100指令执行后,(AL)=64H【例3.2】MOVCL,01001100B指令执行后,(CL)=4CH【例3.3】MOVAX,1234H指令执行后,(AX)=1234H,其中(AH)=12H,(AL)=34H。
立即数如果是多字节数,则高位字节存放在高地址中,低位字节存放在低地址中,如下图所示。2.寄存器寻址(RegisterAddressing)
指令指定寄存器号,操作数存放在指令规定的CPU内部寄存器中。可用于寄存器寻址的为通用寄存器。在微处理器中,对于8位操作数,寄存器可以是AH、AL、BH、BL、CH、CL、DH和DL;对于16位操作数,寄存器可以是AX、BX、CX、DX、SP、BP、SI和DI。在80386及其后继机型中,对于32位操作数,32位寄存器包括EAX、EBX、ECX、EDX、ESP、EBP、EDI和ESI。在使用寄存器寻址方式时,MOV、PUSH和POP指令也会使用到16位寄存器CS、ES、DS、SS、FS和GS。这些寄存器在指令中,使用的寄存器类型要匹配,8位和16位,16位和32位及8位和32位寄存器是不能混用的。有些指令可除外,如:SHLAX,CL。寄存器寻址不需要访问存储器,也不需要使用总线周期,操作在CPU内部进行,因而可取得较高的运算速度。【例3.4】MOVAX,BX
指令执行前,(AX) = 5678H,(BX) = 1234H;指令执行后,(AX) = 1234H,(BX) = 1234H。除上述两种寻址方式外,以下各种寻址方式的操作数均在代码段以外的存储区中,寻址方式通过不同的途径求得操作数的偏移地址,即有效地址EA。3.直接寻址(DirectAddressing)
直接寻址由指令直接给出操作数的有效地址EA,操作数本身在存储单元中,通常存放在数据段,默认的段寄存器为DS。操作数有效地址格式为:[数值]或符号或[符号]【例3.5】MOVAX,[2040H]
指令执行情况如图3.2所示。执行结果为:(AX) = 6A4BH在汇编语言指令中可以用符号地址代替数值地址。【例3.6】MOVAX,[TABLE];或MOVAX,TABLE;这两者等价,此处TABLE为存放操作数单元的符号地址。如果要对其他段寄存器所指出的存储区进行直接寻址,则在指令前必须用前缀指出段寄存器名。【例3.7】MOVAX,ES:[2000H];将ES段的2000H和2001H两单元的内容传送到AX中。4.寄存器间接寻址(RegisterIndirectAddressing)
操作数的有效地址存放在基址寄存器或变址寄存器中,而操作数则在存储器中。对16位数进行寄存器间接寻址时可用的寄存器是基址寄存器BX、BP和变址寄存器SI、DI。使用BP时默认的段寄存器为SS,使用其他寄存器默认的段寄存器为DS。在32位寻址时8个32位通用寄存器均可用。操作数有效地址格式为:[间接寻址的寄存器]。寻址寄存器放在方括号中。【例3.8】MOVBX,[BP]指令执行前,(BP) = 4000H,指令执行情况如图3.3所示。执行结果为:(BX) = 50A0H。【例3.9】MOVAX,ES:[SI];寄存器间接寻址方式可用于表格处理,执行完一条指令后,只需修改寄存器的内容就可以取出表格中的下一项。5.寄存器相对寻址(RegisterRelativeAddressing)
操作数的有效地址为指令中规定的间接寻址寄存器的内容和指令中指定的位移量之和。操作数存放在存储器中。操作数有效地址格式为:位移量[间接寻址的寄存器]或[位移量
+ 间接寻址的寄存器]
参与寻址的寄存器要加方括号。在32位寻址时,8个32位通用寄存器均可用。16位寻址时,可用的寄存器仍为BX、BP、SI和DI。【例3.10】MOVAX,TAB[SI]如果TAB为16位的符号地址,其值为3080H,(SI)= 2000H,默认的段寄存器为DS,则EA = TAB + (SI) = 3080H + 2000H = 5080H指令执行情况如下图所示。执行结果为(AX) = 1234H。这种寻址方式可用于表格处理或访问一维数组中的元素。把表格的首地址设置为位移量,利用修改间接寄存器的值来存取表格中的任意一个元素。表3.2寄存器相对寻址示例6.基址变址寻址(BasedIndexedAddressing)
操作数的有效地址是一个基址寄存器和变址寄存器的内容之和,操作数本身在存储单元中。操作数有效地址格式为:[基址寄存器][变址寄存器]。寄存器要放在方括号中。在32位寻址时,8个32位通用寄存器均可用。【例3.11】MOVAX,[BX][SI]如果(BX) = 0200H,(SI) = 0010H,(DS) = 3000H,则:EA=(BX)+(SI)=0200H+0010H=0210H
物理地址=(DS)×10H+EA=3000H×10H+0210H = 30210H
若30210H和30211H中分别存放的数值为56H、78H,则指令执行结果(AX) = 7856H。
这种寻址方式同样适用于数组或表格处理,首地址存放在基址寄存器中,变址寄存器访问数组中各元素。因两个寄存器都可以修改,所以它比寄存器相对寻址方式更灵活。
注意:两个寄存器不能均为基址寄存器,也不能均为变址寄存器。7.相对基址变址寻址(RelativeBasedIndexedAddressing)
操作数的有效地址为指令中规定的1个基址寄存器和1个变址寄存器的内容及指令中指定的位移量三者之和。操作数本身在存储单元中。操作数有效地址格式为:
位移量[基址寄存器][变址寄存器]
寻址寄存器要放在方括号中。在32位寻址时,8个32位通用寄存器均可用。【例3.12】MOVAX,TAB[BX][SI]如果(BX) = 1000H,(SI) = 2000H,TAB = 0150H则EA = (BX) + (SI) +TAB = 3150H指令执行情况如图3.5所示。执行结果为(AX) = 1234H。这种寻址方式通常用于对二维数组的访问。位移量为数组起始地址。基址寄存器和变址寄存器分别存放行和列的值,利用相对基址变址寻址就可以直接访问二维数组中指定的某个元素。表3.3相对基址变址寻址示例8.隐含寻址(ConcealedAddressing)
有些指令的指令码中不包含指明操作数地址的部分,而其操作码本身隐含地指明了操作数的地址。如:LODSB;表示SI的内容送到AL,SI指针加1。以上的数据寻址方式同样适用于与存储器单元统一编址的I/O端口,一个I/O口地址就是一个存储单元地址。对I/O端口的访问只能用存储器访问指令。如果I/O端口是按照独立的I/O空间编址的,则I/O口和存储器单元各有自己的地址,可以使用不同的指令,对I/O端口的寻址有以下两种方式。(1)直接端口寻址方式。端口地址用8位地址码表示,在指令码中。格式如下:INAL(AXorEAX),port8;
OUTport8,AL(AXorEAX)
如:INAL,21H。这条指令表示从I/O地址为21H的端口中读取数据到AL中。(2)间接端口寻址方式。端口地址为16位,并规定存放在寄存器DX中。格式如下:INAL(AXorEAX),DX;
OUTDX,AL(AXorEAX)DX中是16位端口地址,范围为0000H~FFFFH。如:INAL,DX。这条指令表示从DX寄存器内容所指定的端口中读取数据到AL中。9.比例变址寻址(ScaledIndexedAddressing)
该寻址方式和后面2种寻址方式中均涉及到比例因子,这些是80386及其后继机型中特有的寻址方式,8086/8088不支持这几种寻址方式。
比例变址寻址使用1个变址寄存器的内容乘以比例因子与位移量之和来访问存储器。在32位寻址时,在不加段超越前缀时,除ESP以外的任何32位通用寄存器均可作为变址寄存器。操作数有效地址格式为位移量
[变址寄存器 * 比例因子]或[位移量
+ 变址寄存器 * 比例因子]
可以表示成多种形式组合。寻址寄存器要放在方括号中。比例因子可取1、2、4或8,分别对应存储序列元素的大小为1、2、4或8个字节。当比例因子为1时将被隐含。【例3.13】MOVEAX,ARRAY[4*EBX]
有效地址EA = ARRAY + 4*EBX,将DS:EA中双字的内容送入EAX中。10.基址比例变址寻址(BasedScaledIndexedAddressing)
基址比例变址寻址使用2个32位寄存器来访问存储器(1个基址寄存器和1个变址寄存器)。操作数有效地址格式为[基址寄存器][变址寄存器 * 比例因子]或[基址寄存器
+ 变址寄存器 * 比例因子]
可以表示成多种形式组合。寻址寄存器要放在方括号中。在不加段超越前缀时,除EBP、ESP是默认SS为段选择器外,其余6个通用寄存器均以DS为默认段选择器。操作数的有效地址为变址寄存器的内容乘以比例因子与基址寄存器之和。同样,比例因子可取1、2、4或8,分别对应存储序列元素的大小为1、2、4或8个字节。【例3.14】MOVAX,[EBX + 4*ECX]
有效地址EA =EBX+ 4*ECX,将DS:EA中字的内容送入AX中。11.相对基址比例变址寻址
相对基址比例变址寻址操作数的有效地址为变址寄存器的内容乘以比例因子、基址寄存器的内容、位移量三者之和。操作数有效地址格式为位移量[基址寄存器][变址寄存器 * 比例因子]或[位移量
+ 基址寄存器
+ 变址寄存器 * 比例因子]
可以表示成多种形式组合。寻址寄存器要放在方括号中。它所允许使用的寄存器和比例因子同上。【例3.15】MOVAL,ARRAY[EBP + 2*EDI]
有效地址EA =ARRAY + EBP + 2*EDI,将SS:EA中字节的内容送入AL中。3.2.2程序转移地址寻址方式程序执行顺序是由CS和IP的内容来决定的。程序转移及调用指令通过改变IP和CS内容,就可改变程序执行顺序。根据程序转移地址相对于当前程序地址的关系,可分为段内、段外。又根据转移地址是否直接出现在指令中,分为直接、间接。所以有四种程序转移寻址方式:段内直接寻址、段内间接寻址、段间直接寻址及段间间接寻址。1.段内直接寻址(IntrasegmentDirectAddressing)
段内直接寻址方式也称为相对寻址方式。指令码中包括一个位移量disp,转移的有效地址为:EA = (IP) + disp。位移量在指令码中是用补码形式表示的8位或16位有符号数。当位移量是8位时,称为短程转移;当位移量是16位时,称为近程转移。指令的汇编语言格式为JMPSHORT
符号地址JMPNEARPTR
符号地址
【例3.16】请看下列程序段中的jmpshortnext指令执行情况。地址机器码
5B1B:00172BC3 subax,bx
5B1B:0019B80000movax,0
5B1B:001CEB03 jmp
0021;等效为jmp
shortnext,转移到标号next处
5B1B:001E03C3 addax,bx
5B1B:002041 inccx
5B1B:002150 next: pushax
5B1B:0022BE0200mov
si,25B1B:001CEB03 jmp0021;等效为jmpshortnext,转移到标号next处5B1B:001E03C3 addax,bx5B1B:002041 inccx
5B1B:002150next: pushax
本例中,jmpnext指令的当前(IP)=001EH,相对偏移量为03H,EA=001EH+03H=0021H,因此指令跳转到0021H处执行指令。段内直接寻址过程如下图所示。对于386及其后继机型中,代码段的有效地址存放在EIP中,位移量为8位或32位。2.段内间接寻址(IntrasegmentIndirectAddressing)
程序转移的有效地址是一个寄存器或存储单元的内容。这个寄存器或存储单元的内容可以用数据寻址方式中除立即数以外的任何一种寻址方式获得,所得到的有效地址用来取代IP寄存器的内容。指令的汇编语言格式为JMP寄存器JMP存储单元由于以上两种寻址方式仅修改IP的内容, 所以这种寻址方式只能在段内进行程序转移。【例3.17】JMPBX如果(BX) = 1020H,则指令执行后(IP) = 1020H【例3.18】JMPTABLE[BX][SI]如果(DS) =
2000H,(BX) = 1020H,(SI) = 0002H,TABLE = 0010H,(21032H) = 1234H,指令执行后EA=(BX)+(SI)+TABLE
=1020H+0002H+0010H=1032H则:(DS)×10H+EA=2000H×10H+1032H=21032H所以(IP)=1234H寄存器寻址相对基址变址寻址2000H:1032H34H12H对于386及其后继机型,除16位寻址方式外,还可使用32位寻址方式,修改EIP的内容。【例3.19】JMPEBX如果(EBX) = 20001002H,则指令执行后(EIP) = 20001002H3.段间直接寻址(IntersegmentDirectAddressing)
指令中直接给出程序转移的代码段地址和偏移地址来取代当前的CS和IP。指令的汇编语言格式为:JMPFARPTR
符号地址;其中FARPTR表示段间转移的操作符。
【例3.20】请看下列程序段中的jmpfarptrnext指令执行情况。
地址机器码 代码段1
5B16:00172BC3 subax,bx
5B16:0019B80000 movax,0
5B16:001CEA24001B5B jmp
5B1B:0024
;等效为jmp
farptr
next
5B16:002103C3 addax,bx
地址机器码 代码段2
5B1B:0024 50 next:pushax
5B1B:0025BE0200 mov
si,2本例中,jmpfarptr
next指令等价于jmp5B1B:0024,执行该指令,程序跳转到代码段2,(CS) = 5B1BH,(IP) = 0024H。段间直接寻址过程如图3.7所示。next:pushax对于386及其后继机型,段间转移应修改CS和EIP的内容,方法与16位寻址方式相同。4.段间间接寻址(IntersegmentIndirectAddressing)
程序转移的有效地址是一个存储单元中连续4个字节的内容。这个存储单元的内容可以用数据寻址方式中除立即数和寄存器方式以外的任何一种寻址方式获得。将所寻址的存储单元前2个字节内容送IP,后2个字节内容送CS。指令的汇编语言格式为:JMPDWORDPTR存储单元。【例3.21】JMPDWORDPTR[BX]
如果(BX) = 1034H,且从1034H开始的连续4个存储单元内容分别为12H、34H、56H、78H,则指令执行后(IP)=1234H,(CS)=5678H。该指令的段间间接寻址过程如图3.8所示。对于386及其后继机型,除16位寻址方式外,还可使用32位寻址方式,方法与16位寻址方式相同。
3.3指令格式
本节将介绍助记符指令格式和指令编码格式,并了解助记符指令是如何翻译成机器码的,即了解编译程序的工作。转至3.480X86指令系统3.3.1助记符指令格式汇编语言源程序中助记符指令书写的基本格式为
(标号):(前缀指令)操作码(操作数);(注释)标号代表某条指令所存单元的符号地址。后边要加上冒号“:”。标号为程序转移、循环提供了转移目标地址。标号由字母、数字(0,…,9)及特殊符号(?,·,@,-,$)组成,且通常以字母开头。字符总数必须不大于31个。不允许使用保留字(关键字)。前缀指令与操作码、操作码与操作数之间必须以空格分开。有时在操作码前面加前缀,它和操作码配合使用,从而实现某些附加操作。
操作码是指令语句中不可缺少的;多个操作数间是以‘,’隔开的;带括号的项是可选项,如果有此项时,不能加括号;注释是为阅读方便而加的说明,并用分号‘;’作为间隔符。汇编程序对其不进行处理。例如:DONE:MOVAX,BX;将寄存器BX的内容传送到AX中,BX的内容不变。↑标号↑操作码↑操作数↑注释3.3.2指令编码格式指令编码格式是指每条指令所对应的二进制编码(即机器码)的表示格式。
8086指令系统的操作指令由1~7个字节组成,其包括操作码、寻址方式及操作数部分(位移量、立即数),即:⑴⑵⑶⑷⑴在操作码字节中,OPCODE规定了处理器执行的操作,如加、减、传送等,具体操作采用编码表示。D位规定了数据流的方向,指明了寻址方式字节指定的R/M和REG域之间的数据流动方向。当D = 0时,REG域指定的寄存器操作作为源操作数;当D = 1时,REG域指定的寄存器操作作为目的操作数,而源操作数来自R/M域中的存储器或另一个寄存器。W位用于表示操作数的长度是字节或字。当W = 0时,操作数为字节;当W = 1时,操作数为字。表3.4寄存器地址编码寄存器地址编码与W位之间的编码关系如表3.4所示。⑵寻址方式字节中各个域的含义如下:MOD域:选择寻址类型,指定R/M域为寄存器还是存储器,如果为存储器,还要指定是否有偏移量,偏移量为8位还是16位。MOD域与R/M域之间的组合关系如下表所示。REG域:规定寄存器操作数。采用三位编码表示8个寄存器。R/M域:表示寄存器或存储器,受MOD域控制。如为寄存器,则与寄存器域相同,如为存储器,则有8种组合的寻址方式。⑶指令编码格式中的位移量表示指令中直接给出寻址方式所需的偏移量。
8位偏移量占1个字节,16位偏移量占2个字节,低8位偏移量在前,高8位偏移量在后。⑷立即数表示指令中直接给出操作数。
8位立即数占1个字节,16位立即数占2个字节,低8位在前,高8位在后。【例3.22】写出指令“MOVAL,[DI+0008]”的机器码。
MOVAL,[DI+0008]的机器码由操作码字节、寻址字节和两个字节的偏移量构成。根据指令查阅指令编码相关手册得到操作码字节内容为:100010DW。从指令中得到目的操作数是AL的内容,D=1,W=0,则操作码字节内容为10001010B=8AH。 当D = 0时,REG域指定的寄存器操作作为源操作数当D = 1时,REG域指定的寄存器操作作为目的操作数,而源操作数来自R/M域中的存储器或另一个寄存当W = 0时,操作数为字节;当W = 1时,操作数为字。【例3.22】写出指令“MOVAL,[DI+0008]”的机器码。 源操作数[DI+0008]由表3.5指定寻址字节中的MOD(10B)和R/M域(101B),寻址字节中的REG域由目的操作数寄存器AL指定,查表3.4得到REG域为000B,则寻址字节内容为:10000101B=85H。最终得到的指令编码内容为:8A850800H。
8086指令系统为了指定段寄存器,还提供了“段跨越前缀”的特殊字节,其格式如图3.10所示。图3.10段跨越前缀字节格式
80386/80486指令系统的32位数操作指令由1~14个字节组成,其中包括前缀、操作码、寻址方式及操作数部分,即其中,前缀由操作数长度前缀(66H)和地址码长度前缀(67H)组成;操作数由位移量、立即数组成。
3.480X86指令系统指令系统是指微处理器所能执行全部指令的集合。不同微处理器具有不同的指令系统。
80X86系列的CPU中,其指令系统的机器代码是完全向上兼容的。
80X86指令系统按功能可分为以下9类:
(1)数据传送类指令;
(2)算术运算类指令;
(3)逻辑运算和移位类指令;
(4)位操作指令;
(5)串操作指令;
(6)控制转移类指令;
(7)处理器控制指令;
(8)高级语言类指令;
(9)操作系统型指令。√√√√表3.6缩写符号及其说明3.4.1数据传送类指令数据传送类指令用于实现立即数到寄存器或存储器、CPU内部寄存器之间、寄存器与存储器之间、累加器与I/O口之间的数据传送。除标志位传送指令之外,数据传送类指令不会影响标志寄存器中的标志位。这类指令又分为通用数据传送、地址传送、标志传送和输入输出等4组指令。1.通用数据传送指令通用数据传送指令包括最基本的传送指令、堆栈指令、数据交换指令、换码指令。指令的基本格式和操作如表3.7所示。表3.7通用传送指令1)基本的传送指令基本的传送指令包括MOV、MOVSX、MOVZX。其中MOVSX、MOVZX仅在386及其后继机型中可用。●传送指令(move)——MOV
指令格式:MOVDST,SRC
指令功能:将源操作数SRC的内容传送到目的操作数DST所指单元,而源操作数的内容保持不变,完成字节、字或双字传送。源操作数可以是通用寄存器(REGn)、段寄存器(SEG)、立即数(DATAn)和存储单元(MEMn)。目的操作数可以是通用寄存器(REGn)、段寄存器(SEG)、存储单元(MEMn)。存储单元可通过数据寻址的各种寻址方式寻址。在使用MOV指令时应注意以下几点:(1)目的操作数不得为立即数。如:MOV12H,BL为非法指令。(2)不影响标志位。(3)操作数类型必须一致。如:MOVAX,BL为非法指令,应为MOVAL,BL。(4)源操作数为非立即数时,两操作数之一必为寄存器。如:MOV[DX],[SI]为非法指令,不能在两个存储单元之间进行数据传送。(5)目的操作数为段寄存器(CS和IP或EIP不能作为目的寄存器),源操作数不得为立即数。(6)不能在段寄存器之间进行直接数据传送。如:MOVDS,ES为非法指令。
几个不能传送操作的解决办法是通过AX作桥梁。存储器←存储器:
MOVAX,MEM1
MOVMEM2,AX段寄存器←段寄存器:
MOVAX,SEG1
MOVSEG2,AX段寄存器←立即数:
MOVAX,DATA
MOVSEG,AX●带符号扩展传送指令——MOVSX
指令格式:MOVSXREG16(32),REG8(16)/MEM8(16)
指令功能:将源操作数符号扩展送入目的寄存器,可以是8位符号扩展到16位或32位,也可以是16位符号扩展到32位。源操作数可以是8位或16位的寄存器或存储单元的内容,而目的操作数则必须是16位或32位的寄存器。该指令执行后不影响标志位。【例3.23】MOVSXEAX,CX如果(CX)=0AB20H,CX中的内容为负数,符号位=1。则指令执行后,(EAX)=FFFFAB20H,●零扩展传送指令——MOVZX
指令格式:MOVZXREG16(32),REG8(16)/MEM8(16)
指令功能:将源操作数作零扩展送入目的寄存器,不管源操作数的符号位是否为1,高位均作零扩展。有关源操作数、目的操作数及对标志位的影响均与MOVSX的相同。【例3.24】MOVZXEAX,CL
如果(CL) = 0FAH,CL中的符号位 = 1。指令执行后,(EAX) = 000000FAH,2)堆栈指令:堆栈指令包括压栈PUSH、PUSHA、PUSHAD、PUSHF、PUSHFD出栈POP、POPA、POPAD、POPF、POPFDPOPF、POPFD指令由装入值来确定标志位的值外,其余指令均不影响标志位。
PUSHA/PUSHAD、POPA/POPAD用于386及其后继机型。堆栈的存取在16位指令中必须以字为单位进行压入弹出操作。在32位指令中必须以双字为单位进行压入弹出操作。● 压栈/出栈指令——PUSH/POP
指令格式:PUSHSRC;POPDST
指令功能:执行PUSH指令时,将(E)SP的内容减2(16位指令中)或减4(32位指令中),指向新的栈顶位置。执行POP指令时,正好相反。每弹出一个字或双字至目的操作数地址中,(E)SP的内容加2或加4。
PUSH指令的源操作数可以是通用寄存器(REG)、段寄存器(SEG)、立即数(DATA)和存储单元(MEM),它可使用所有的寻址方式,8086系统不允许使用立即数寻址方式,但在386及其后继机型中允许立即数进栈。
POP指令的目的操作数可以是通用寄存器(REG)、段寄存器(SEG)和存储单元(MEM),不允许使用立即数寻址方式。
CS值可压入堆栈,但不能弹出一个字到CS寄存器。PUSHCSPUSH1234HPOP[EBX]在8086系统中非法,在80386及其后继机型中合法。【例3.25】PUSHAX如果(AX) = 1234H,(SP) = 0100H,则指令执行后,(SP) = 00FEH,【例3.26】POPAXPOPAX指令执行前与执行后的情况如图3.12所示。图3.12POPAX的执行示意图【例3.27】1、如果将AX,BX两个寄存器的内容互换,则可执行下列程序段实现。2、如果保持寄存器进出栈前后内容不变,则出栈的顺序与进栈的顺序相反。PUSH AXPUSH BXPOP AXPOP BXPUSH AXPUSH BXPOP BXPOP AX●所有寄存器压栈/出栈指令——PUSHA/PUSHAD;POPA/POPAD指令格式:PUSHA ;POPA
PUSHAD ;POPAD指令功能:PUSHA将所有16位通用寄存器(AX,CX,DX,BX,SP,BP,SI,DI)依次进栈,指令执行后,(SP)←(SP)-16仍指向栈顶;PUSHAD将所有32位通用寄存器(EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI),依次进栈,指令执行后(ESP)←(ESP)-32指向栈顶。POPA将堆栈中16位的数据依次弹出至所有16位通用寄存器,弹出顺序为:DI,SI,BP,SP,BX,DX,CX,AX,指令执行后,(SP)←(SP)+16指向栈顶;POPAD将堆栈中32位的数据依次弹出至所有32位通用寄存器,弹出顺序为:EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX,指令执行后,(ESP)←(ESP) +32指向栈顶。【例3.28】PUSHAD
如果指令执行前32位通用寄存器的内容为AX,CX,DX,BX,SP,BP,SI,DI●标志进出栈指令——PUSHF/PUSHFD;POPF/POPFD指令格式:PUSHF ; POPF
PUSHFD ; POPFD
指令功能:将FLAGS/EFLAGS标志寄存器中内容压入堆栈;从堆栈中弹出字或双字至FLAGS/EFLAGS标志寄存器中。【例3.29】若要求将陷阱标志TF置位,则可用如下程序段实现:
PUSHF
POP AX
OR AH,01H
PUSH
AX
POPF00000001
3)数据交换指令数据交换指令包括XCHG、CMPXCHG、XADD和BSWAP等指令。其中,CMPXCHG、XADD和BSWAP用于386及其后继机型。●交换指令(exchange)——XCHG
指令格式:XCHGDST,SRC
指令功能:将两个操作数的内容相互交换。两操作数长度可以是字节、字或双字,且类型必须一致,不能同时为存储器操作,其中之一必为寄存器。操作数可用除立即数外的任何寻址方式。两个操作数可以同时为寄存器,但不允许同时都为段寄存器。该指令执行后不影响标志位。例如:XCHGAH,BL
XCHGES,AX
XCHGEAX,ARRAY[4*EBX]●比较交换指令(compareandexchange)—— CMPXCHG
指令格式:CMPXCHGDST,SRC
指令功能:将累加器中的内容与目的操作数相比较。如果它们相等,则将源操作数拷贝到目的操作数所指单元,且置ZF为1;如果它们不相等,将目的操作数拷贝到累加器中,且置ZF为0。该指令对8位、16位、32位数都适用。目的操作数可以是通用寄存器REGn和存储单元MEMn。源操作数只能为REGn。存储单元可通过数据寻址的各种寻址方式寻址。例如:CMPXCHGBX,DX如果(BX) = (AX),则(BX) = (DX),且ZF = 1;如果(BX) ≠ (AX),则(AX) = (BX),且ZF = 0。●变换加指令(exchangeandadd)——XADD
指令格式:XADDDST,SRC
指令功能:XADD指令和其他的加法指令一样,将源操作数和目的操作数之和存入目的操作数所指存储单元。不同之处在于,在相加完成后,原来的目的操作数将被存入源操作数所指存储单元内,改变了源操作数的内容。目的操作数可以是通用寄存器REGn和存储单元MEMn。源操作数只能为REGn。存储单元可通过数据寻址的各种寻址方式寻址。该指令执行后对标志位的影响与加指令的相同。例如:XADDAL,DL如果(AL) = 12H,(DL) = 34H,则当指令执行后,(AL) = 46H,而(DL) = 12H。●字节交换指令(byteswap)——BSWAP
指令格式:BSWAPREG32
指令功能:将指令指定的32位寄存器的字节次序变反。即1、4字节互换,2、3字节互换。该指令执行后不影响标志位。例如:BSWAPEAX如果指令执行前,(EAX)=44223366H,则指令执行后,(EAX)=66332244H,
4)换码指令
XLAT为换码指令(translate),也称为查表转换指令,是用查表方式将一种代码转换成另一种代码。
指令格式:XLAT
该类指令是隐含寻址。指令中规定(E)BX指向存放在某一内存表格的首地址AL为表格中某一元素与表格首地址之间的偏移量表格中的内容即为要替换的代码指令执行后在AL中得到转换后的代码。指令执行后不影响标志位。34H35H36H……TABLE+0TABLE+1TABLE+2
【例3.30】十进制数0~9与BCD码和字型码的相互转换如表3.8所示。请编写指令,将5转换成共阳极LED显示的字型代码。表3.8中七段显示代码中高电平“1”表示不亮,低电平“0”表示亮。如:共阳极LED显示的字型代码“0”(即十进制数“0”)只有G不亮,为高电平“1”。对于顺序排列的表格,可用换码指令XLAT来实现查表功能。假设表格存放在内存中的首地址以标号TABLE表示。将BX指向表格首地址,将表格偏移量(即序号)放入AL中。本例中偏移量为05H。用如下程序段可实现查表换码功能:MOV AX,SEGTABLE;将标号的段地址用SEG
伪指令提取出来MOV DS,AXMOV BX,OFFSETTABLE;将标号的偏移地址用OFFSET伪指令提取出来
MOV AL,05
XLAT ;EA=(BX)+(AL),(AL)=(EA)该程序执行后,(AL)=12H
2.地址传送指令
80X86提供了6条将地址信息传送到指定寄存器的指令,包括LEA、LDS、LES、LSS、LFS和LGS。其中LSS、LFS和LGS仅用于80386及其后继机型。该类指令执行后不影响标志位。
1)有效地址传送指令——LEA(loadeffectiveaddress)
指令格式:LEAREG,SRC;(REG)←SRC
指令功能:将源操作数的有效地址EA传送到指定寄存器中。
源操作数的寻址方式只能是存储器寻址方式(即不允许是立即数和寄存器寻址方式),目的操作数的寄存器可使用16位或32位寄存器,但不能为段寄存器。【例3.31】参见图3.15,比较以下两条指令的执行结果。
LEABX,[DI]
MOV BX,[DI]第一条指令执行后,(BX) = 0010H;第二条指令执行后,(BX) = 0FF00H。
MOV指令和LEA指令的区别,前者传送源操作数所指单元的内容,后者传送源操作数的有效地址。图3.15LEA与MOV指令的区别【例】设BX=1000H,DS=6000H,(61005H)=33H,(61006H)=44H。试比较以下两条指令的执行结果:
LEA
BX,[BX+5]
MOV
BX,[BX+5]LEA指令执行后:BX=1005H;MOV指令执行后:BX=4433H。
2)指针传送指令
LDS指令和LES、LFS、LGS、LSS等指令的格式类同,只是指针指定的段寄存器不同而已。
指令格式:LDSREG,MEM;(REG)←(MEM),(DS)←(MEM+2)或(DS)←(MEM+4)
指令功能: 将源操作数MEM所指定存储单元中连续4个单元的前两个单元的内容作为有效地址存入指令指定的16位寄存器(REG)中,后两个单元的内容装入指令指定的段寄存器(DS)中;当指令指定的是32位寄存器时,将该存储单元中连续存放的4个单元的内容作为有效地址装入该寄存器中,而其后的2个单元的内容装入指令指定的段寄存器(DS)中。源操作数MEM的寻址方式只能是存储器寻址方式(即不允许是立即数和寄存器寻址方式),目的操作数(REG)不能为段寄存器(SEG)。
【例3.32】LDSBX,TABLE[SI]如果指令执行前,TABLE=0200H,(SI)=0008H,(DS)=4000H,(BX)=5A80H,则EA=TABLE+(SI)=0200H+0008H=0208H。在DS:0208H单元中存放的数据如图3.16所示。指令执行后,(BX) = 1234H(DS) = 1000H
【例3.33】LSSESP,DS:[0100H]将DS:0100H单元中存放的48位地址分别装入ESP和SS寄存器中。
6×8
前4个存储单元后2个存储单元
3.标志传送指令:用于标志寄存器传送的指令有标志送AH指令——LAHFAH送标志寄存器指令——SAHF标志进栈指令——PUSHF/PUSHFD
标志出栈指令——POPF/POPFDLAHF、SAHF指令为隐含寻址。图3.17LAHF指令功能1) 标志送AH指令——LAHF
指令格式:LAHF;(AH)←(FLAGS的低字节)
指令功能:将标志寄存器FLAGS的低8位中5个状态标志位(不包括OF)分别传送到AH的对应位,如图3.17所示。该指令的执行不影响标志位。
2) AH送标志寄存器——SAHF
指令格式:SAHF ;(FLAGS的低字节)←(AH)
指令功能:SAHF指令与LAHF指令功能相反,即将AH中相应位(D7、D6、D4、D2、D0)的状态分别传送到标志寄存器FLAGS的对应位(SF、ZF、AF、PF、CF),而FLAGS其他位不受影响。
4.输入输出指令
80X86提供了IN和OUT输入输出指令,也称为累加器专用指令。该类指令仅限于用累加器AL、AX、EAX传送信息。输入输出指令只有两种寻址方式:直接寻址方式和寄存器间接寻址方式。输入输出指令执行后不影响标志位。1)输入指令(input)——IN:用于I/O端口到CPU的数据输入操作。INAL,port
;(AL)←(port)INAX,port
;(AX)←(port+1,port)INEAX,port
;(EAX)←(port+3,port+2,port+1,port)INAL,DX
;(AL)←((DX))INAX,DX
;(AX)←((DX)+1,(DX))INEAX,DX
;(EAX)←((DX)+3,(DX)+2,(DX)+1,(DX))
2)输出指令(output)——OUT:用于CPU到I/O端口的数据输出操作。OUTport
,AL;(port)←(AL)OUTport
,AX;(port+1,port)←(AX)OUTport
,EAX;(port+3,port+2,port+1,port)←(EAX)OUTDX
,AL;((DX))←(AL)OUTDX
,AX;((DX)+1,(DX))←(AX)OUTDX
,EAX;((DX)+3,(DX)+2,(DX)+1,(DX))←(EAX)例如:INAL,41H;表示从端口地址为41H中输入字节数到AL中INAX,41H;表示从端口地址为41H中输入字到AX中MOVDX,A378H
;将端口地址A378H送入DX寄存器中OUTDX,EAX
;表示从EAX输出双字数据到(DX)~(DX)+3所指的四个端口中3.4.2算术运算类指令
80X86提供了加、减、乘、除等各类算术运算指令,这些指令可处理4种类型的数据:有符号的二进制数、无符号的二进制数、无符号的组合十进制数和无符号的分离十进制数。转至3.4.4位操作指令表3.9算术运算指令续表
1.加减法指令:加减法指令有不带进(借)位的加减法指令ADD、SUB;带进(借)位的加减法指令ADC、SBB;增减量指令INC、DEC;特殊减法指令即求补指令NEG;比较指令CMP。
1) ADD/SUB——加/减法指令指令格式:ADDDST,SRC ;SUBDST,SRC
指令功能:ADD指令将目的操作数与源操作数相加之和送到目的操作数所指单元中。SUB指令将目的操作数与源操作数相减之差送到目的操作数所指单元中。指令执行后源操作数保持不变,但指令会影响SF、ZF、CF、AF、PF和OF等6个标志位。指令中源操作数可以是通用寄存器REGn、立即数DATAn和存储单元MEMn。目的操作数可以是REGn和MEMn,但不得为立即数。源操作数和目的操作数都不能是段寄存器,存储单元可通过数据寻址的各种寻址方式寻址。使用加、减法指令时,应注意源操作数为非立即数时,两操作数之一必为寄存器,两存储单元之间不能进行加、减法运算。两操作数类型必须一致,可以同时为字节、字或双字。
例如:ADDAX,DI ;(AX)←(AX) + (DI)SUBBL,5FH ;(BL)←(BL) - 5FHADD[EBP],AL ;((EBP))←((EBP)) + (AL)ADDAX,[EBX+2*ECX];将(EBX+2*ECX)所指向的存储
;单元中的内容加上AX的内容,
;并将结果存入AX中下边3条指令是非法的。ADDDS,BX ;操作数不允许为段寄存器SUB[DI],[BP] ;不允许两操作数都为存储单元ADD34H,EAX ;目的操作数不能为立即数
2) ADC/SBB——带进/借位加/减法指令指令格式:ADCDST,SRC ;SBBDST,SRC
指令功能:带进/借位的加/减法指令将进/借位标志位的值(CF)一起与操作数相加/减。该组指令主要针对出现在8086中超过16位的数据或80386及其后继机型中超过32位的数据进行多字节加/减法的运算中。其中CF的当前值是由程序中本指令之前的指令产生的。其他规定均与ADD/SUB指令相同。
3) INC/DEC——增减量指令指令格式:INC DST ;DECDST
指令功能:INC/DEC将目的操作数的内容加/减1。用于循环程序中指针修改。该组指令影响OF、SF、ZF、AF、DF标志位,但不影响CF位。目的操作数可以是REGn和MEMn。目的操作数不能是段寄存器,目的操作数不得为立即数。存储单元可通过数据寻址的各种寻址方式寻址。对于非立即数存储器增减量,数据必须用字节、字、双字这些类型来描述。例如,DEC[SI]这条指令,可以是一个字节、字或双字大小的减量,DECBYTEPTR[SI]:表明是一个字节型的存储器数据,DECWORDPTR[SI]:是指一个字型的存储器数据,DECDWORDPTR[SI]:指的是一个双字型的存储器数据。
【例3.34】求26584336H+3619FECAH=? 内存中数据存放形式如图3.18所示。请给出使用8位加法指令完成两数之和的程序段。8086指令程序段为:
LEA SI,ARY1 ;ARY1偏移地址送SI
LEADI,ARY2 ;ARY2偏移地址送DI
LEABX,SUM ;SUM偏移地址送BX
MOVCX,4 ;循环4次
CLC ;清进位CF标志AGAIN:MOVAL,[SI]
ADCAL,[DI] ;带进位加
MOV[BX],AL;结果存入SUM
INCSI ;调整指针
INCDI
INCBX
DECCX ;循环计数器减1
JNZAGAIN ;若未处理完,则转AGAIN图3.19给出第0字节相加之后标志位的值;图3.20给出第0、1字节相加过程中进位如何将2个字节加法组合成字相加。图3.19加法结果对标志位的影响图3.20进位将2个8位加法组合成16位相加
【例3.35】若(AL) = 11H,请给出执行SUBAL,33H指令后对标志位的影响。图3.21给出减指令执行后标志位的值。图3.21减法结果对标志位的影响
4)求补指令(negate)——NEG指令格式:NEGDST
指令功能:对一个操作数取补码,即相当于用0减去目的操作数,并将结果送回到目的操作数。可利用NEG指令得到补码表示的负数的绝对值。【例3.36】若(AX) = 0FF0EH = [-242]补,则执行NEGAX后,即得到
(AX) = 00F2H =│-242│= +242
请给出执行NEGAX指令后对标志位的影响。指令执行后标志位的值为:
CF = 1(最高位D15向前有借位)SF=0(符号位为0)
AF = 1(D3位有借位) PF=0(奇数个‘1’)
OF = 0(无溢出) ZF = 0(结果非零)
5)比较指令(compare)——CMP
指令格式:CMPDST,SRC 指令功能:比较指令是一个只改变标志位的减法,而目的操作数、源操作数不发生改变。指令中两操作数类型必须一致,目的操作数不为立即数,两操作数之一必为寄存器。两操作数不允许为段寄存器。例如:
CMPBX,8000H
CMPAX,BX
CMP[DI],CH
CMPBX,[EDI+ESI]比较指令后面常常会跟一个跳转指令,以检测标志位,控制程序的走向。
CMP指令执行后可根据标志位判断比较结果。根据ZF判断两个数是否相等。若ZF = 1,则两数相等。若两个数不相等,则分两种情况考虑:①比较的是两个无符号数:若CF = 0,则(DST)≥(SRC);若CF = 1,则(DST)<(SRC)。②比较的是两个有符号数:若OF⊕SF = 0,则(DST)>(SRC);若OF⊕SF = 1,则(DST)<(SRC)。
2.乘法指令乘法指令有单操作数的无符号数乘法指令MUL和有符号数乘法指令IMUL指令。
386及其后继机型中还增加了双操作数和三操作数有符号数乘法指令IMUL指令。乘法指令的操作数的类型可以是字节、字或者双字。仅80386及其后继机型可以对32位的双字型数据使用乘法指令。
1)无符号数乘法指令(multiple)——MUL指令格式:MULSRC 指令功能:将目的操作数乘以源操作数,结果存放到目的操作数中。目的操作数是隐含寻址,必须为累加器,用于存放被乘数及乘积的一部分。源操作数用于存放乘数,可以是寄存器或存储器中的数据,但不允许为立即数。乘法指令执行完后的结果总是一个两倍于原数据大小的数据。当两个8位数相乘时,16位乘积存放在AX中;当两个16位数相乘时,32位乘积存放在DX:AX中,其中高位字存放在DX中,低位字存放在AX中;当两个32位数相乘时,64位乘积存放在EDX:EAX中,其中高位字存放在EDX中,低位字存放在EAX中。当乘法指令执行完后,一些标志位(CF和OF)会改变,产生预期的结果。其他的标志位也会改变,不过它们的结果是无法预知的,因而不能被利用。
CF、OF表示乘积值的范围:若AH(字节乘)/DX(字乘)/EDX(双字乘)乘积值高位为零,则CF = OF = 0。若AH中存有积的有效值,则CF = OF = 1。
【例3.37】若(AL) = 0C5H,(BL) = 11H,求执行指令MULBL后的乘积值。
(AL) = 0C5H为无符号数的197;
(BL) =11H为无符号数的17,则执行后,(AX) = 0D15H为无符号数的3349。D15H=110100010101B=211+210+28+24+22+20=3349AH中存有积的有效值,所以CF=OF=1
2)有符号数乘法指令(signedmultiple)——IMUL
分为三种:有符号单操作数乘法指令、有符号双操作数乘法指令、有符号三操作数乘法指令。●有符号单操作数乘法指令指令格式:IMULSRC 指令功能:与MUL相同,只是必须是有符号数。对于有符号数,IMUL执行
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 健身教练聘用合同范本
- 外协生产市场调研策略
- 垃圾分类处理挖机租赁协议样本
- 市政道路新建工程路基施工合同
- 智能停车场建设合同
- 科技资源拓展房屋拆迁施工合同
- 曲棍球比赛场地租赁合同
- 天津市菜市场市场调研数据备份
- 洗衣店装修工程投标样本
- 精神健康诊所医生聘用合同样本
- 特种设备“日管控”安全检查记录、每周安全排查治理报告
- 2023年江苏南京航空航天大学工作人员招聘56人笔试《行政职业能力测验》模拟试卷(答案详解版)
- 2024年中国中煤能源集团限公司招聘10人高频考题难、易错点模拟试题(共500题)附带答案详解
- 心理健康科普文化墙
- 【川教版】《生态 生命 安全》四年级上册第10课《认识传染病》课件
- 装修垃圾清运处置方案
- 家庭影音室装修方案
- 艺术设计就业职业生涯规划
- 2024年浙江杭州滨江城建发展有限公司招聘笔试参考题库含答案解析
- 枪库应急处置预案
- 处理不同类型客户的技巧与策略
评论
0/150
提交评论