第3章 80x86 cpu指令系统_第1页
第3章 80x86 cpu指令系统_第2页
第3章 80x86 cpu指令系统_第3页
第3章 80x86 cpu指令系统_第4页
第3章 80x86 cpu指令系统_第5页
已阅读5页,还剩161页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

云南大学软件学院本科教学课程教学单位:云南大学软件学院教师:王逍80X86计算机组成与汇编语言第三章 80x86cpu指令系统

指令或称为语句,是源程序中最小的代码单元,源程序就是由一条一条的语句构成。全部指令的集合称为指令系统,其确定了cpu所能实现全部功能。机器指令由二进制数组成,计算机硬件只能识别﹑存储和运行机器指令。助记符/符号指令/汇编指令80X86汇编语言的指令助记符表示操作码,用符号或符号地址表示操作数或操作数地址,它与机器指令基本上是一一对应的。指令的结构计算机的指令包括:操作码

操作数

↓操作的性质操作的对象(1或2个字节)+

↓存放在(位置不同)

寄存器、存储器、I/O端口地址、立即数(由寻址方式决定)机器指令由操作码字段和操作数字段两部分组成。操作码字段:说明cpu完成何种操作。在机器指令中对每个操作码对应一个唯一的二进制编码。操作数字段:也称地址码,说明参加操作的数据对象本身或保存数据对象的位置。操作数字段可以有一个,二个或三个操作数或0个。指令的分类根据操作数的个数单操作数、双操作数、无操作数指令书写格式操作码

操作数1,操作数2,……指令的编码80X86CPU指令系统采用变长的指令格式。一条指令可以由1~16个字节组成。可能需要占用连续多个的存储单元,存放指令的第一个存储单元地址称为指令地址。一条指令可能包含需要操作的对象即操作数,也可能占用内存的多个存储单元。一个操作数如果占用连续多个的存储单元,也是进行连续存放,其中,操作数的低位存放在低地址存储单元中,高位存放在高地址部分。存放数据的第一个存储单元地址称为操作数的地址。寻址方式寻址方式的定义指令中说明操作数所在地址的方法。寻址:操作数所在的位置操作数所在的位置1、指令代码中,这种操作数为立即数。例:MOVAL,08H2、cpu内部的通用寄存器或段寄存器中,这种操作数为寄存器操作数。例:INCCX3、存储单元中,这种操作数为内存操作数。内存操作数占用一个或者连续多个存储单元中。机器指令中操作数字段包含着此操作数所在的第一个存储单元的逻辑地址。4、输入/输出端口中,这种操作数为端口操作数。寻址方式分类1、隐含寻址方式2、数据型操作数寻址方式3、目标寻址方式立即寻址方式寄存器直接寻址方式直接寻址方式寄存器间接寻址方式寄存器相对寻址方式基址变址寻址相对基址变址寻址*比例寻址*串操作寻址*

I/O端口寻址相对程序寻址直接程序寻址间接程序寻址数据型操作数寻址方式一、立即寻址方式

(ImmediateAddressing)1.含义:操作数是立即数(即8位,16位或32位的常数),直接包含在指令中。2.特点:翻译成机器码时,立即数是指令的一部分,紧跟在操作码之后存放在代码段内。在取出指令的同时也就取出了操作数,立即有操作数可用,所以称之为立即寻址。如果立即数是l6/32位数:高字节→高地址单元,低字节→低地址单元3.作用:常用于给寄存器赋初值4、注意:立即数可以送到寄存器、一个存储单元(8位)、两个连续的存储单元(16位)中去;立即数只能作源操作数,不能作目的操作数;以A~F打头的数字出现在指令中时,前面必须加数字0。以免与其它符号相混淆(如:MOVAX0FF00H)。例: MOVCX,2A50H ;指令的编码格式如图

MOVCX,2A50H例: 立即数寻址MOVAL,01010101BMOVAX,-120MOVAX,A0H;思考:指令是否正确?

MOVEAX,12345678HMOVDL,’A’ ;’A’为立即数寻址MOVCX,3*5MOVBX,1234HMOVBX,34H;思考:指令是否正确?MOVBL,1234H;思考:指令是否正确?MOVCL,4MOVCL,300;思考:指令是否正确?

;对比:C语言中,charc=300是否正确?二、寄存器(直接)寻址方式

(RegisterAddressing)1.含义:操作数包含在寄存器中,寄存器的名称由指令指定。2.特点:32位操作数:寄存器可以是EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP等;16位操作数:寄存器可以是AX、BX、CX、DX、SI、DI、SP和BP等。8位操作数:寄存器AH、AL、BH、BL、CH、CL、DH和DL。3.作用:寄存器之间传递数据。4.注意:源操作数的长度必须与目的操作数—致。MOVBL,BX不允许段寄存器间直接传输。MOVES,DS不允许代码段寄存器作为目标操作数。MOVCS,AX内存操作数的寻址方式

(RegisterAddressing)绝大多数操作数存放在一个或连续多个代码段以外的存储单元中。CPU执行指令时根据程序中的逻辑地址自动转换得到物理地址后寻址某个存储单元,最后取出其中的信息。任何一个内存单元的地址(逻辑地址)实际上由两部分组成:1、段的基地址:该存储单元所在段的基地址,即该段的第一个存储单元的地址(如果是寻找操作数,在大多数情况下,数据存放在数据段寄存器DS中);2、段内偏移量:该存储单元相对于所在段的段基址的距离/偏移量。称为偏移地址或者有效地址(EA,EffectiveAddress)。段基址和偏移地址合称为逻辑地址。CPU在寻找某个存储单元时根据逻辑地址的段基址和偏移地址就能形成(由CPU的地址生成部分自动完成)最终的物理地址,从而找到相应的存储单元。在存储器操作数寻址方式中,一个存储单元完整的逻辑地址表达式为:段R:[基址R+变址R*比例因子+位移量]冒号之前称为段超越前缀助记符(简称段超越前缀),用于通知CPU在生成物理地址时应该使用那个段寄存器的内容以获取逻辑段的段基址。冒号之后的部分称为有效/偏移地址表达式。用来通知CPU在生成物理地址时在一个逻辑段中的某个存储单元,相对于段基址的偏移/有效地址。

[]表示括号中的内容是存储单元的偏移/有效地址、而不是操作数本身。有效地址(EA):在一个逻辑段中,某存储存储单元相对于段首址的地址位移量。有效地址(EA)的组成部分:基址:存放在基址寄存器变址:存放在变址寄存器比例因子:386及其后继机型新增加的术语。其值可为1,2,4,或8,可用变址寄存器的内容乘以比例因子来取得变址值位移量:存放在指令中的一个8/16/32位的数,但它不是一个立即数,而是一个位移量(偏移地址的一部分)。表16/32位寻址时偏移地址的构成16位寻址32位寻址基址寄存器BX,BP任何32位的通用寄存器变址寄存器SI,DI除ESP以外的32位通用寄存器比例因子无1,2,4,8位移量字长0,8,160,8,3280x86指令系统提供了多种存储器寻址方式。直接寻址;寄存器间接寻址;基址寻址;变址寻址;基址加变址。三、直接寻址方式(DirectAddressing)1.含义:存储单元的有效地址EA(即:操作数的偏移地址)由指令的操作数字段中直接给出。即:EA=操作数操作数可以是8位,16位,32位(仅在保护模式中)。2.特点:机器码中,有效地址存放在代码段中指令的操作码之后,而该地址单元中的数据总是存放存储器中。须先求出操作数的物理地址,再从存储器中取得操作数。操作数的物理地址=16×DS

(默认)+EA3.作用:

实现对存储单元的读/写操作。

4.

段超越前缀:可以使用段超越前缀指定段地址,省略时默认为DS。例MOVAX,ES:[100]Debug中应该写位es:movax,[100]物理地址=16×ES+1006.符号地址汇编语言中一般用符号地址代替直接数值地址,由编译器来计算操作数的有效直接地址,防止人工计算地址出错。例:

AREA1DW0867H MOVAX,AREA1 MOVAX,[AREA1] MOVAX,ES:[AREA1]区分:

MOVAL,78H MOVAL,[78H] MOVAX,DS:[78H] MOVAL,ES:[78H]例

MOVAX,[2000H]解:设DS=3000H,由指令得:EA=2000H(16位逻辑地址)物理地址=16×3000H+2000H=32000H(20位,20根地址线)设32000H地址单元的内容为1234H,即(32000H)=1234H

则:AX=1234H

指令执行过程如图所示。(注:如用AL替代AX,则AL=34H)四、寄存器间接寻址方式(RegisterIndirectAddressing)1.含义:操作数的有效地址EA放在寄存器中,寄存器在中括号中[],寄存器称为间接寄存器。EA=间接寄存器寄存器的内容并不是操作数,而是操作数所在的内存中某个存储单元的偏移地址。2.16位寻址可以使用的寄存器有:基址寄存器BX、BP,变址寄存器SI、DI。

如果使用BX、SI、DI寄存器,则默认操作数在数据段DS中

如果使用BP寄存器,则默认操作数在堆栈段SS中操作数的物理地址=16×DS+BX/SI/DI

或=16×SS+BP四、寄存器间接寻址方式(RegisterIndirectAddressing)3.32位寻址可以使用的寄存器有:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP

如果使用EBP,ESP寄存器,则默认操作数在堆栈段SS中;使用其他寄存器,则默认操作数在数据段DS中操作数的物理地址=16×DS+EAX/EBX/ECX/EDX/ESI/EDI

或=16×SS+EBP/ESP4.作用:

实现对存储单元的读/写操作。

例MOVBX,[SI]

解:设:DS=1000H,SI=2000H,(12000H)=318BH

则:物理地址=16×DS+SI

=10000H+2000H

=12000H

指令执行后,BX=318BH,指令执行过程如图所示。4.注意:寄存器名称外必须加方括号,以区别寄存器直接寻址方式;不允许使用8位寄存器;可以使用段超越前缀来从默认段以外的段中取得数据; 例: MOVBX,ES:[SI]; MOVFS:[EBP],DL; Debug与debug32的不同:

debug中输入es:movbx,[si]

debug32中输入movdl,fs:[ebp] 区分:MOVAL,[BX]; MOVAL,BX五、寄存器相对寻址方式(RegisterRelativeAddressing)

1.16位寻址含义:

操作数的有效地址是基址寄存器BX,BP或变址寄存器SI,DI的内容与8位或16位位移量(Displacement)之和。即

[BX]/[BP]EA=+8位偏移量/16位偏移量COUNT

[SI]/[DI]2.16位寻址特点:

可以使用寄存器:BX、BP、SI、DI。

操作数的物理地址=16×DS+BX/SI/DI+COUNT

或=16×SS+BP+COUNT五、寄存器相对寻址方式(RegisterRelativeAddressing)

3.32位寻址含义:

操作数的有效地址是EBP、ESP、EAX、EDX、ESI、EDI、EBP、ESP的内容与8位或16位或32位位移量(Displacement)之和。即

[EAX]

/[EBX]/[ECX]/[EDX]EA=+8位偏移量/16位偏移量/32位偏移量COUNT

[ESI]/[EDI]/[EBP]/[ESP]4.32位寻址特点:操作数的物理地址= 16×DS+EAX/EBX/ECX/EDX/ESI/EDI+COUNT

或=16×SS+EBP/ESP+COUNT例MOVBX,COUNT[SI];或:MOVBX,[COUNT+SI]解:设:DS=3000H,SI=2000H,位移量COUNT=4000H,

(36000H)=318BH

则:物理地址=16×DS+SI+COUNT

=30000H+2000H+4000H

=36000H指令执行后,BX=318BH403000六、基址变址寻址方式(RegisterRelativeAddressing)1.16位寻址含义:操作数的有效地址是一个基址寄存器(BX、BP)的内容与一个变址寄存器(SI、DI)的内容之和。2.16位寻址特点:

使用的寄存器:基址寄存器BX、BP,变址寄存器SI、DI

操作数的物理地址=16×DS+BX+SI/DI

或=16×SS+BP+SI/DI3.注意:

寄存器SI和DI、BP和BX不能同时出现在[]中。六、基址变址寻址方式(RegisterRelativeAddressing)3.32位寻址含义:操作数的有效地址是一个基址寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP)的内容与一个变址寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP)的内容之和。4.32位寻址特点:

使用的寄存器:基址寄存器EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP,变址寄存器EAX、EBX、ECX、EDX、ESI、EDI、EBP

操作数的物理地址=16×DS+EAX/EBX/ECX/EDX+ESI/EDI

或=16×SS+EBP/ESP+ESI/EDI例MOVAX,[BX][SI];或:MOVBX,[BX+SI]解:设:DS=3000H,SI=0500H,BX=1200H,

(31700H)=0ABCDH

则:物理地址=16×DS+SI+BX

=30000H+0500H+1200H

=31700H指令执行后:AX=0ABCDH七、相对基址变址寻址方式(RelativeBasedIndexedAddressing)

1.16位寻址含义:操作数的有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容,再加上8位或16位位移量之和。即

[BX][SI]EA=+8位或16位位移量

[BP][DI]2.16位寻址特点:

使用的寄存器:基址寄存器BX、BP,变址寄存器SI、DI。

操作数的物理地址=16×DS+BX+SI/DI+8/16位位移量

或=16×SS+BP+SI/DI+8/16位位移量3.注意:寄存器SI和DI、BP和BX不能同时出现在[]中。七、相对基址变址寻址方式(RelativeBasedIndexedAddressing)

3.32位寻址含义:操作数的有效地址是一个基址寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP)和一个变址寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP)的内容,再加上8位或16位位移量或32位位移量之和。即

[EAX]/[EBX]/[ECX]/[EDX]/[EBP]/[ESP]EA=+ 8位或16位位移量或32位位移量

+ [ESI][EDI]3.32位寻址特点:

使用的寄存器:基址寄存器EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP,变址寄存器EAX、EBX、ECX、EDX、ESI、EDI、EBP

操作数的物理地址=16×DS+EAX/EBX/ECX/EDX+ESI/EDI+8/16/32位位移量或=16×SS+EBP/ESP+ESI/EDI+8/16/32位位移量29例MOVAX,MASK[BX][SI];或:MOVBX,[MASK+BX+SI]解:设:DS=3000H,SI=0300H,BX=1500H,MASK=0200H,(21A00H)=26BFH

则:物理地址=16×DS+SI+BX+MASK

=20000H+0300H+1500H+0200H

=21A00H指令执行后AX=26BFH*八、比例变址寻址方式(ScaledIndexedAddressing)

1.含义:操作数的有效地址是一个32位基址寄存器+一个32位变址寄存器的内容乘以比例因子,再加上8位或16位或32位位移量之和。2.特点:

使用的寄存器:基址寄存器EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP,变址寄存器EAX、EBX、ECX、EDX、ESI、EDI、EBP比例因子=1:字节、2:字、4:双字、8:寻4字*八、比例变址寻址方式(ScaledIndexedAddressing)

3.注意:由于32位寻址方式能使用所有的通用寄存器,所以,和该有效地址相组合的段寄存器也就有新的规定。具体规定如下:

1、地址中寄存器的书写顺序决定该寄存器是基址寄存器,还是变址寄存器;如:[EBX+EBP]中的EBX是基址寄存器,EBP是变址寄存器,而[EBP+EBX]中的EBP是基址寄存器,EBX是变址寄存器;

2、默认段寄存器的选用取决于基址寄存器;

3、基址寄存器是EBP或ESP时,默认的段寄存器是SS,否则,默认的段寄存器是DS;

4、在指令中,如果使用段前缀的方式,那么,显式段寄存器优先。

*八、比例变址寻址方式(ScaledIndexedAddressing)

*八、比例变址寻址方式(ScaledIndexedAddressing)

*九、串操作寻址方式(OperationWayOfAddressing)

1.含义:用于串的传递,采用隐含规定的变址寄存器SI和DI,DS为源操作数的缺省段基值2.特点: SI、DI获得源操作码地址指针和目的操作码地址指针

对SI、DI进行自动修改,修改方向由标志寄存器FR中的DF方向决定,

DF=1:SI\DI自动减1或2;DF=0:SI\DI自动增1或2;3.注意:字节操作时指针增减量为1,字操作时指针增减量为2。例:MOSB;MOVSW十、其它1.隐含寻址:

指令中不指明操作数,但有隐含规定的寻址方式。如:指令DAA对寄存器AL中的数据进行十进制数调整,结果仍保留在AL中。2.I/O端口寻址:

8086有直接端口和间接端口两种寻址方式。

▲直接端口寻址方式:指令直接提供端口地址——8位立即数。可访问端口00~FFH,即256个端口。例如,INAL,63H;表示将瑞口63H中的内容送进AL寄存器

▲间接端口寻址方式:端口地址由寄存器DX提供,端口号为0000—FFFFH。例如:MOV DX,213H ;DX=口地址号213H INAL,DX;AL←端口213H中的内容

3.2.4目标地址寻址方式 这种寻址方式用来确定转移指令及CALL指令的转向地址。一、直接程序寻址方式

(ImmediateAddressing)1.含义:直接给出指令中所需要的目标地址信息。2.举例:JMP1000H:A000H3.注意:转移的目标地址常用叫作标号的内存地址表示JMPLPCALLSUB13.2.4目标地址寻址方式二、相对程序寻址方式

(ImmediateAddressing)1.含义:目标地址相对于当前指令指针(取出指令后的IP值)的位置位移量disp=目标地址IP-当前IP值。2.举例:JMP0004HIP=IP(当前:0000H)+2=0002位移:0004H-0002H=23.2.4目标地址寻址方式三、间接程序寻址方式

(ImmediateAddressing)1.含义:目标地址在寄存器中或是在存储器中2.举例:JMPAXJMP[DI+2]=JMPDS:[DI+2]将:DS*16+DI+2地址中内容视为目标地址按功能分为以下六类:

数据传送指令算术运算指令逻辑运算和移位指令字符串处理指令控制转移指令处理器控制指令3.380x86的指令系统注:◎数据传送指令共18条;◎除SAHF和POPF指令外,对标志位均没有影响。通用数据传送指令MOVMOVSXMOVZXPUSHPOPPUSHA/PUSHADPOPA/POPADXCHGXLAT字节或字或双字的传送带符号扩展传送带零扩展传送入栈指令出栈指令所有寄存器进栈所有寄存器出栈交换双字或字或字节表转换输入输出指令INOUT输入输出地址目标传送指令LEALDSLES装入有效地址装入数据段寄存器装入堆栈段寄存器标志传送指令LAHFSAHFPUSHF/PUSHFDPOPF/POPFD标志寄存器低字节装入AHAH内容装入标志寄存器低字节标志寄存器入栈指令出栈,并送入标志寄存器3.3.1传送类指令:1.通用数据传送指令(GeneralPurposeDataTranfer)

⑴MOV传送指令(Move)

指令格式:MOV目的(dest),源(src);destsrc

指令功能:实现CPU的内部寄存器间或寄存器与存储器间的数据传送。

注意:▲指令中至少要有—项明确说明传送的是字节还是字还是双字;▲IP/EIP寄存器不能用作源操作数或目的操作数;▲立即数和CS寄存器不能用作目的操作数;▲MOV指令不能在两个存储单元之间直接传送数据,也不能在两个段寄存器之间直接传送数据。立即数段寄存器CSDSESSSFSGS通用寄存器(E)AX(E)BX(E)CX(E)DX(E)SP(E)BP(E)DI(E)SI存储器

1.通用数据传送指令(GeneralPurposeDataTranfer)

⑴MOVSX/MOVZX传送

指令格式:MOVSX/MOVZX目的(dest),源(src);

指令功能:将源操作数扩展传送到目的操作数,80386及以上使用

MOVSX的源操作数应为带符号整数,带符号扩展指令;MOVZX的源操作数应为无符号整数,所以做零扩展。

源操作数可以是8位或16位的寄存器或存储器单元的内容,而目的操作数必须是16位或是32位的寄存器。

MOVSX/MOVZX不影响标志位。

例 MOVSXEAX,CL

把CL寄存器中的8位数,符号扩展为32位数,送到EAX寄存器中。

例 MOVSXEDX,[EDI]

把DS段中由EDI内容指定地址的16位数符号扩展为32位数,送到EDX寄存器中。

MOVZXDX,AL

把AL寄存器中的8位数,零扩展成16位数,送到DX寄存器中。

MOVZXEAX,DATA

把DATA单元中的16位数,零扩展为32位数,送到EAX寄存器中。

(2)XCHG交换指令(Exchange)

指令格式:XCHGdest,

src;dest

src

指令功能:源操作数、目的操作数数据交换。允许字或字节操作,386及其后继机型还允许双字操作。操作数要求:交换可以在寄存器之间、寄存器与存储器之间进行;

段寄存器不能作为操作数;不能直接交换两个存储单元中的内容。

设AX=2000H,DS=3000H,BX=1800(3lA00H)=1995H。则执行指令XCHGAX,[BX+200H]后,结果如何?

解:把内存中的一个字与AX中的内容进行交换。源操作数的物理地址=3000H×10H十1800H十200H=31A00H,指令执行后:AX=1995H,(3lA00H)=2000H

指令格式:XLAT转换表(内存标号)ORP或:XLAT 指令功能:AL=DS:[BX/EBX+unsignedAL]

使累加器(AL)中的一个值变换为内存表格中的某一个值,一般用来实现编码制的转换,即查表功能。 XLAT指令使用步骤:使用之前必须先建立一个表格,表格中的内容是所需要转换的代码;将转换表的起始地址装入BX/EBX寄存器;欲查的某项与表头地址的位移量AL,即表格最多包含256个字节;执行XLAT指令后,根据位移量从表中查到转换后的代码值AL寄存器中。(3)XLAT表转换指令(TableLookup—Translation)

若十进制数字0~9的LED七段码对照表如下表所示,试用XLAT指令求数字5的七段码值。

解:程序如下:

TABLEDB40H,79H,24H,30H,19H ;建表,表格起始地址为TABLEDB12H,02H,78H,00H,18H ;七段码存于对TABLE的;位移量为0~9的单元位移

……………MOV AL,5 ;AL数字5的位移量

MOV BX,OFFSETTABLE ;BX表格首地址

XLATTABLE ;查表得:AL=12H十进制数字七段显示码十进制数字七段显示码040H512H179H602H224H778H330H800H419H918H

(4.1)PUSH进栈指令指令格式:PUSHSRC

指令功能:数据入堆栈

工作过程:

16位操作数:

SP←SP-2;(SP+1,SP)←SRC源操作数要求:可以是16位通用寄存器、段寄存器、存储器中的数据字,但不能是立即数。

32位操作数:

ESP←ESP-4;

(ESP+3,ESP+2,ESP+1,ESP)←SRC

源操作数要求:可以是32位通用寄存器、存储器中的数据双字,可以是立即数(使用ptr说明)。注意:实模式中。ESP的高16位被清零,只是用ESP的低16位,即SP。…最后一项高地址栈底(SP/ESP)压入弹出栈顶(SS)SP/ESP总是指向偶地址单元段址

(4.2)POP出栈指令指令格式:POPDEST指令功能:数据出堆栈

工作过程:

16位操作数:

DEST←(SP+1,SP);SP←SP+2;目的操作数要求:可以是16位通用寄存器、段寄存器、存储单元,但CS不能作目的操作数。

32位操作数:

DEST←(ESP+3,ESP+2,ESP+1,ESP);

ESP←ESP+4;目的操作数要求:可以是32位通用寄存器、存储单元。

见PUSH的注意。…最后一项高地址栈底(SP/ESP)压入弹出栈顶(SS)SP/ESP总是指向偶地址单元段址例:MOV AX, DAYAMOV DS, AXLEA BX, DA1MOV AX, STACK1MOV SS, AXLEA SP, STAPUSH [BX]PUSH [BX+2]POP [BX]POP [BX+2]76HA0H1BH82HXXHXXHXXHXXHXXHBX-DA1SS-STACK1SP=SP-2SP=SP-2SP-STADS-DATA说明:PUSH指令:先使堆栈指针SP(ESP)减2(4),然后把一个字(双字)操作数存入堆栈顶部。POP指令:把栈顶的一个字(双字)传送至指定的目的操作数,然后堆栈指针SP(ESP)加2(4)。区分:

PUSHSP指令入栈的是该指令已修改了的SP新值;

PUSHESP指令入栈的却是ESP在执行该指令之前的旧值。

(4.3)PUSHA/PUSHAD

指令格式:PUSHA/PUSHAD

指令功能:所有寄存器进栈,80386及以上使用

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。实模式中是SP-32

(4.4)POPA/POPAD

指令格式:POPA/POPAD

指令功能:所有寄存器出栈,80386及以上使用

POPA执行操作:

16位通用寄存器依次出栈,出栈次序为:DI,SI,BP,SP,BX,DX,CX,AX

。指令执行后(SP)←(SP)-16仍指向栈顶。

SP的出栈只是修改了指针使其后的BX能顺利出栈,而堆栈中原先由PUSHA指令存入的SP的原始内容被丢弃,并未真正送到SP寄存器中去。

POPAD执行操作:

32位通用寄存器依次出栈,出栈次序为:EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX

。指令执行后(ESP)←(ESP)-32。 与POPA相同,堆栈中存放的原ESP的内容被丢弃而不装入ESP寄存器。

2.标志传送指令(FlagTransfers):4条读取标志指令:LAHF(5、3、1为任意值)

--标志寄存器低8位→AH设置标志指令:SAHF

--标志寄存器低8位←AH把标志寄存器的内容压入堆栈:PUSHF/PUSHFD从堆栈弹出到标志寄存器:POPF/POPFD1511109876543210OFDFIFTFSFZFAFPFCFAHD7D6D4D2D0(1)LAHF标志送到AH指令(LoadAHfromFlag)

指令格式:LAHF

指令功能:

标志寄存器SF、ZF、AF、PF和CF→

AH寄存器的位7、6、4、2和0。

注意:◎位5、3、1的内容未定义,(一般1位是1,3、5位是0)。◎执行这条指令后,标志位本身并不受影响。1511109876543210OFDFIFTFSFZFAFPFCFAHD7D6D4D2D0⑵SAHFAH送标志寄存器(StoreAHintoFlags)

指令格式:SAHF

指令功能:AH内容

→标志寄存器。

注意:◎位5、3、1的内容未定义,(一般1位是1,3、5位是0)。◎执行这条指令后,高位标志并不受影响。

1511109876543210OFDFIFTFSFZFAFPFCFAHD7D6D4D2D0⑶PUSHF/PUSHFD标志入栈指令(PushFlagontoStack)

指令格式:PUSHF/PUSHFD

指令功能:整个标志寄存器的内容

堆栈;

修改堆栈指针,

PUSHF,16位标志寄存器入栈,SPSP-2;

PUSHFD,32位标志寄存器入栈,SPSP-4;指令执行后对标志位无影响。⑷POPF/POPFD标志出栈指令(PopFlagoffStack)

指令格式:POPF/POPFD

指令功能:堆栈指针SP所指的一个字/双字

标志寄存器PSW;

修改堆栈指针,

POPF,16位标志寄存器出栈,SPSP+2;

POPFD,32位标志寄存器出栈,SPSP+4;

4.地址目标传送指令(AddressObjectTransfers):

目标地址传送指令可以拥有传送操作数的段地址和偏移地址。⑴LEA取有效地址指令(LoadEffectiveAddress)

指令格式:LEA目的,源

指令功能:源操作数地址的偏移量→目的操作数所在寄存器

要求:

源操作数:必须是存储单元;

目的操作数:必须是一个除段寄存器之外的16位/32位寄存器。

注意:与MOV指令的区别。例

假设SI=1000H,DS=5000H,(51000H)=1234H

LEABX,[SI]

;执行完该指令后,BX=l000H MOVBX,[SI]

;执行完该指令后,BX=1234H例LEABX,TABLE

;可用MOV指令代替LEA指令

MOVBX,OFFSETTABLE ;两条指令等价。

某数组含20个元素,每个元素占一个字节,符号为:0~19。设DI指向数组开头处,把序号为6的元素的偏移地址送到BX中,用什么指令来实现?解:LEABX,6[DI] ;只能用LEA实现,不能用MOV⑵LDS/LES/LFS/LGS/LSS将双字指针送到寄存器和DS/ES/FS/GS/SS指令(LoadPointerusingDS)指令格式:LDS/LES/LFS/LGS/LSS 目的,源指令功能:前两个字节(偏移地址)→

指定的目的寄存器;

后两个字节(段地址)→DS/ES/FS/GS/SS寄存器。操作数要求:

源操作数:必须是存储单元(该单元开始的连续4个/6个字节存放一个变量的地址指针);

目的操作数:必须是16/32位寄存器,但不能用段寄存器。

执行的操作:

16位指令:(REG)←(MEM) (SREG)←(MEM+2)

32位指令:(REG)←(MEM) (SREG)←(MEM+4)

LFS、LGS和LSS只能用于386及其后继机型中。例

设:DS=0100H,BX=0020H,(01020H)=0300H,(01022H)=0500H。执行指令LESDI,[BX]后,结果如何?解:DI=0300H,ES=0500H例设:DS=1200H,(12450H)=0F346H,(12452H)=0A90H。执行指令LDSSI,DS:[450H]后,结果如何?解:SI=0F346H,DS=0A90H

2.输入输出指令(InputandOutput):IN指令:指定端口中的数据→累加器OUT指令:累加器中的数据→指定端口⑴IN输入指令(Input)

指令格式:

①直接寻址:长格式,端口地址(00~FFH)直接包含在IN指令里,共允许寻址256个端口。

INAL,端口地址 或

INAX,端口地址

INEAX,端口地址

②间接寻址:短格式,端口地址>0FFH时,先将端口号送DX寄存器,再执行输入操作。共允许寻址64K个端口

INAL,DX

INAX,DX

INEAX,DX指令功能:

从8位端口读入一个字节到AL寄存器,或从16位端口读一个字到AX寄存器,或从32位端口读一个字到AX寄存器。注意:16/32位端口由2/4个地址连续的8位端口组成。

⑵OUT输出指令(Output)指令格式:

①直接寻址:长格式,端口地址(00~FFH)直接包含在OUT指令里,共允许寻址256个端口。OUT端口地址,AL或

OUT端口地址,AX

或OUT端口地址,EAX

②间接寻址:短格式,端口地址>0FFH时,先将端口号送DX寄存器,再执行输入操作。共允许寻址64K个端口OUTDX,AL

OUTDX,AX

OUTDX,EAX

指令功能:将AL寄存器中1个字节输出到8位端口,或将AX寄存器中2个字节输出到16位端口,或将EAX寄存器中4个字节输出到32位端口,。注意:16/32位端口由2/4个地址连续的8位端口组成。1)每个端口可以保存一个字节的外设数据。2)端口号或DX的内容均为地址,而传送的是端口中的信息,而且在用短格式时DX内容就是端口号本身,不需要由任何段寄存器来修改它的值。例INAL,0F1H

;AL从F1H端口读入一个字节

INAX,80H ;AL80H口的内容,AH81H口的内容

MOVDX,310H

;端口地址310H先送入DX中

INAL,DX

;AL310H端口的内容例OUT85H,AL ;85H端口AL内容

MOVDX,0FF4H ;端口地址DX=0FF4HOUTDX,AL ;0FF4H端口AL内容

MOVDX,300H ;DX指向300HOUTDX,AX ;300H端口

AL内容,301H端口AH内容3.3.2、算术运算指令算术运算指令可处理4种类型的数无符号二进制整数带符号二进制整数无符号压缩十进制整数(PackedDecimal)无符号非压缩十进制整数(UnpackedDecimal)

一个8位二进制数可看成4种不同类型的数,所表示的数值亦不同。66二进制码(B)十六进制(H)无符号二进制(D)带符号二进制(D)非压缩十进制压缩十进制00000111077+77071000100189137-119无效8911000101C5197-59无效无效数的表示:

二进制数:可以是8位或16位或32位,若是带符号数,则用补码表示。压缩十进制数:一个字节中存放两个BCD码十进制数。非压缩十进制数:—个字节的低半字节存放十进制数,高半字节为全零。例如,对十进制数字58:压缩十进制数表示:只需一个字节,即01011000B;非压缩十进制数表示:需两个字节,即00000101B和00001000B。1.加法指令(Addition)⑴ADD加法指令(Addition)

指令格式:ADD目的,源指令功能:目的源十目的

⑵ADC带进位的加法指令(AdditionwithCarry)

指令格式:ADC目的,源

指令功能:目的源十目的十CF操作数的要求:(包括上两条指令)

源操作数:可以是寄存器、存储器、立即数;

目的操作数:只能用寄存器、存储单元。注意:

★源、目的操作数不能同时为存储器,且类型必须一致,即都是字节或字或双字,目的操作数不可以是立即数;

★这两条指令影响的标志位为:CF、OF、PF、SF、ZF和AF。

两种加法指令的实例

ADDAL,18H

;ALAL十18H

ADCBL,CL

;BLBL十CL十CFADCAX,DX

;AXAX十DX十CFADDAL,COST[BX] ;AL内容和地址=DS:(COST+BX)的

;存储字节相加,结果送ALADDCOST[BX],BL

;将BL与物理地址=DS:(COST十BX)的 ;存储字节相加,结果留在该存储单元中

用加法指令对两个8位16进制数5EH和3CH求和,并分析加法运算指令执行后对标志位的影响。解:MOVAL,5EH ;AL=5EH(94)

MOVBL,3CH ;BL=3CH(60)

ADDAL,BL ;结果AL=9AH69讨论:MOVAL,5EH

MOVBL,3CH

ADDAL,BL

ADD对标志位的影响▲两个数的相加过程:

010111105EH=94

+00111100即:

+3CH=60100110109AH=154运算后标志位:ZF=0,AF=1,CF=0,SF=l,PF=1,OF=1。▲对标志的解释:人为决定①两个加数都看成无符号数时,运算结果为9AH,即十进制数154。在这种情况下,SF和OF都没有意义,我们只关心ZF和CF标志,在BCD码运算或奇偶校验时才考虑AF或PF标志。②两个加数都当成带符号数时,符号标志SF和溢出标志OF很重要,而进位标志CF没有意义。带符号数能表示的范围-128~+127,而本例中,两个正数94和60相加,其和为154,由于154超过了范围,即产生了溢出,OF=1⑶INC增量指令(Increment)

指令格式:INC目的指令功能:目的目的十1操作数的要求:通用寄存器、内存。注意:▲这条指令主要用在循环程序中,对地址指针和循环计数器等进行修改;▲指令执行后影响AF、OF、PF、SF和ZF,但不影响进位标志CF▲该指令只有一个操作数时,如果要使内存单元的内容增1,程序中必须说明该存储单元是双字还是字还是字节。INC指令的两个应用例子:例 INCBL ;BL寄存器中内容增1INCCX ;CX寄存器中内容增1

例 INCBYTEPRR[BX] ;内存字节单元内容增1INCWORDPTR[BX] ;内存字单元内容增1其中:PTR为类型说明符,前面加BYTE说明操作数类型为字节,加WORD则说明操作数类型为字。加DWORD则说明操作数类型为双字。⑷XADD交换并相加指令(exchangeandadd)

指令格式:XADD目的,源

指令功能:把目的操作数装入源,并把源和目的操作数之和送目的操作数。使用前提:该指令只能用于486及其后继机型。例 XADDBL,DL

如指令执行前:(BL)=12H,(DL)=02H,则指令执行后:(BL)=14H,(DL)=12H。2.减法指令(Subtraction)

⑴SUB减法指令(Subtraction)

指令格式:SUB目的,源

指令功能:目的目的-源例SUBAX,BX

;AXAX—BX

SUBDX,1850H

;DXDX—1850H

⑵SBB带借位的减法指令(SubtractwithBorrow)

指令格式:SBB目的,源

指令功能:目的目的-源-CF(SBB主要用于多字节减法中)

例 SBBAL,CL ;ALAL-CL-CF⑶DEC减量指令(Decrement)

指令格式:DEC目的指令功能;目的目的一l

DECBX

;BXBX—1

DECWORDPTR[BP] ;堆栈段中位于[BP]偏置处的字减1⑷NEG取负指令(Negate)(求相反数)指令格式:NEG 目的指令功能:目的

0-目的,即:对目的操作数取负

例 NEGAX ;将AX中的数取负

NEGBYTEPTR[BX] ;对数据段中位于[BX]处的字节取负

⑸CMP比较指令(Compare)

指令格式:CMP目的,源指令功能:目的与源比较

注意:结果不回送到目的操作数中,仅反映在标志位上。

用途:用在比较两个数大小又不破坏原操作数的场合。(6)CMPXCHG交换并比较指令

(Compareandexchange)

指令格式:CMPXCHG 目的,源 指令功能:累加器AC与DST相比较, 即 (AC)=(DST) 相等 ZF←1,(DST)←(SRC) 不相等 ZF←0,(AC)←(DST)

其中累加器可为AL、AX或EAX寄存器。DST可以是寄存器或内存操作数,SRC只能是寄存器操作数。(7)CMPXCHG8B比较并交换8字节指令(Compareandexchange8byte) 指令格式:CMPXCHG8B目的,源 指令功能:EDX,EAX与DST相比较, 即 (EDX,EAX)=(DST) 相等: ZF←1,(DST)←(EDX,EAX) 不相等:ZF←0,(EDX,EAX)←(DST)

该指令的源操作数为存放于EDX,EAX中的64位字。目的操作数可用存储器寻址方式确定一个64位字。DST只能是内存操作数。 说明:以上两条指令使用486以上cpu。

例CMPAL,80H;AL与80H作比较

CMPBX,DATA1;BX与数据段中偏移量为DATA1处的字比较

CMPXCHGCX,DX

如指令执行前: (AX)=2300H,(CX)=2300H,(DX)=2400H

则指令执行后: 因(CX)=(AX),故(CX)=2400H,ZF=1。

如指令执行前: (AX)=2500H,(CX)=2300H,(DX)=2400H

则指令执行后: 因(CX)≠(AX),故(AX)=2300H,ZF=0。减法指令小结:①对于双操作数指令(SUB、SBB、CMP):▲源操作数可以是寄存器、存储器或立即数;▲目的操作数可以是寄存器、存储器,但不能为立即数;▲两个操作数不能同时为存储器。②对于单操作数指令(DEC、NEG):▲目的操作数可以是寄存器、存储器,但不能为立即数;▲如果是存储器操作数,还必须说明其类型是字节还是字或双字。③运算之后,除DEC指令不影响CF标志外,它们均影响OF、SF、ZF、AF、PF和CF标志。④在减法操作后,如果源操作数大于目的操作数,需要借位时,进位/借位标志CF将被置1。

设AL=10110001B,DL=01001010B,求AL-DL。解:SUBAL,DL;与加法操作一样,对结果的解释取决于参与运算的数的性质运算过程如下:

二进制减法 当成无符号数 当成带符号数

10110001 177 -

79

01001010 -74 -

)+74---------------------- ------------- ----------------- 01100111 103 +103运算后标志位:ZF=0,AF=1,CF=0,SF=0,PF=0,OF=1讨论:▲两数为无符号数:表示177与74的差是103。CF=0表示没有借位,SF和OF无意义。▲两数为带符号数:表示-79-(+74),结果应为-153。但结果却为正数(103),这是由于-153溢出造成的。此时,SF和OF有重要意义。

3.乘法指令(Multiply):

⑴MUL无符号数乘法指令

指令格式:MUL源指令功能:把源操作数和累加器AL/AX/EAX中的数都当成无符号数,然后乘源操作数,结果保存在AX/EAX/EDX,EAX中。

▲源操作数是一个字节:AXAL*源。(即:原操作数与累加器AL中的内容相乘,乘积为双倍长的16位数,高8位送到AH,低8位送AL。)

▲源操作数是一个字:(DX,AX)AX*源(即:原操作数与累加器AX的内容相乘,结果为32位数,高位字放在DX寄存器中,低位字放在AX寄存器中。)

▲源操作数是一个双字:(EDX,EAX)EAX*源(即:原操作数与累加器EAX的内容相乘,结果为64位数,高位双字放在EDX寄存器中,低位双字放在EAX寄存器中。)操作数要求:可以是寄存器、存储单元,但不能是立即数;源操作数可以是字节或字或双字;源操作数是存储单元时,必须在操作数前加BYTEPTR或WORDPTR或DWORDPTR说明是字节还是字或双字。

例MULDL ;AXAL*DLMULCX ;(DX,AX)AX*CXMULBYTEPTR[SI] ;AXAL*(内存中字节)

MULWORDPTR[BX];(DX,AX)AX*(内存中字)注意:▲

MUL指令执行后影响CF和OF标志。如果结果的高半部分(字节操作为AH、字操作为DX)不为零,表明其内容是结果的有效位,则CF和OF均置1。否则,CF和OF均清0。据此可检测并去除结果中的无效前导零。▲

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论