汇编语言80X86的指令系统和寻址方式_第1页
汇编语言80X86的指令系统和寻址方式_第2页
汇编语言80X86的指令系统和寻址方式_第3页
汇编语言80X86的指令系统和寻址方式_第4页
汇编语言80X86的指令系统和寻址方式_第5页
已阅读5页,还剩206页未读 继续免费阅读

下载本文档

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

文档简介

第3章80x86指令系统和寻址方式教学要求:掌握一般指令系统的基本概念:指令格式、功能和注意事项。重点掌握8086/8088指令系统中,各指令的格式、寻址方式、指令类型。1

3.1指令系统的基本概念

计算机的指令系统就是指该计算机能够执行的全部指令的集合。每种计算机都有它支持的指令集合。

16位8086指令系统是整个Intel80x86系列微处理器指令系统的基础。3.1.1指令系统2

操作码

说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分。

操作码操作数···

操作数指令由操作码和操作数两部分组成。

操作数

是指令执行的参与者,即各种操作的对象。有些指令不需要操作数,通常的指令都有一个或两个操作数,也有个别指令有3个甚至4个操作数,通常称为一地址指令、二地址指令、三…3.1.2指令格式3指令的功能——该指令能够实现何种操作。通常指令助记符(操作码)就是指令功能的英文单词或其缩写形式。指令支持的寻址方式——该指令中的操作数可以采用何种寻址方式。指令对标志的影响——该指令执行后是否对各个标志位有影响,以及如何影响。3.1.3学习指令的注意事项43.280x86寻址方式操作数可以跟随在指令操作码之后,称为立即数;操作数也可以存放在CPU内部的寄存器中,称为寄存器操作数。绝大多数的操作数存放在内存储器中,称为存储器操作数。指令指定操作数的位置,即给出地址信息,在执行时需要根据这个地址信息找到需要的操作数。3.2.1寻址、寻址方式的概念寻址就是寻找操作数的地址。寻址方式就是寻找操作数的方法。5

指令助记符体现该指令的功能,它对应一条二进制编码的机器指令。指令的操作数个数由该指令确定,可以没有操作数,也可以有一个、二个或三个操作数。3.2.280X86的指令格式指令助记符[操作数1[,操作数2[,操作数3]]]

[;注释]63.2.3与数据有关的寻址方式在80X86系列中,8086和80286的字长是16位,一般情况下只处理8位和16位数,只是在乘除指令中才会有32位;在386及其后续机型,处理的一般为8,32位数。只有乘除时才会出现64位。7

MOVd,sMOV:数据传送指令

d:目的操作数(DST)

s:源操作数(SRC)指令执行后,把s送到d。83.2.3与数据有关的寻址方式以MOV

指令为例:立即寻址MOVAX,3069H寄存器寻址MOVAL,BH直接寻址MOVAX,[2000H]寄存器间接寻址MOVAX,[BX]寄存器相对寻址MOVAX,COUNT[SI]基址变址寻址MOVAX,[BP][DI]相对基址变址寻址MOVAX,MASK[BX][SI]存储器寻址91)

立即寻址方式

立即寻址方式用来表示常数,它经常用于给寄存器赋初值,并且只能用于源操作数字段,不能用于目的操作数字段,且两者长度保持一致。操作数存放在指令中,紧跟在操作码之后,它作为指令的一部分存放在代码段里,称为立即操作数。这种寻址方式也就称为立即数寻址方式。

10只能用于

SRC字段

MOV40H,AL

SRC和DST的位数要匹配

MOVAH,3064H

MOVAL,5MOVAX,3064HMOVAL,‘A’11【例3.1】MOVAX,4576H执行后(AX)=?

CS→MOVAX,4576H指令的存储形式AXOP76H45H7645该例中源操作数为立即寻址方式,立即数为4576H,存放在指令的下一单元。执行:4576H→AX执行后:(AX)=4576H

12

2)

寄存器寻址方式定义:指令所要的操作数已存储在某寄存器中,把在指令中指出所使用寄存器(即:寄存器的名字)的寻址方式称为寄存器寻址方式。

寄存器R指令操作数寄存器汇编格式:R

(其中R表示寄存器名,如AX、BX等。)功能:操作数直接存放在寄存器R中。图形表示:13指令中可以引用的寄存器及其符号名称如下:

8位寄存器有:AH、AL、BH、BL、CH、CL、DH和DL等;

16位寄存器:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等;注:由于指令所需的操作数已存储在寄存器中,或操作的结果存入寄存器,这样,在指令执行过程中,会减少读/写存储器单元的次数,所以,使用寄存器寻址方式的指令具有较快的执行速度。通常情况下,提倡在编写汇编语言程序时,应尽可能地使用寄存器寻址方式,但也不要把它绝对化。14

MOVAX,BX指令执行前,(AX)=0306H(BX)=1234H指令执行后,(AX)=1234H(BX)=1234H15【例3.2】下列程序执行后,(AX)=?,(BX)=?

MOVAX,1234HMOVBX,5678HADDAX,BX执行:1234H→AX执行后:(AX)=68ACH,(BX)=5678H5678H→BX(AX)+(BX)→AX16以MOV

指令为例:立即寻址MOVAX,3069H寄存器寻址MOVAL,BH直接寻址MOVAX,[2000H]寄存器间接寻址MOVAX,[BX]寄存器相对寻址MOVAX,COUNT[SI]基址变址寻址MOVAX,[BP][DI]相对基址变址寻址MOVAX,MASK[BX][SI]存储器寻址17物理地址(PA)=16

段地址+偏移地址偏移地址

在80x86里,把操作数的偏移地址称为有效地址(effectiveaddress,EA).

18EA=基址+变址

比例因子+位移量基址(base):是存放在基址寄存器里的内容。是有效地址中的基址部分,通常用来指向数据段中数组或字符串的首地址。变址(index):是存放在变址寄存器中的内容,通常用来访问数组中的某个元素或字符串中的某个字符。比例因子:386及其后机型新增加的寻址方式。其值可以是1,2,4或8。访问数组时有用。位移量:是存放在指令中的一个8,16或32位数,表示的是地址。1916/32位寻址时有效地址EA四种成分的组成四种成分16位寻址32位寻址位移量0,8,160,8,32基址寄存器BX,BP任何通用32位寄存器变址寄存器SI,DI除ESP以外的32位通用寄存器比例因子无1,2,4,8默认段选择规则P39表3.220默认段选择规则访存类型所用段及段寄存器缺省选择规则指令代码段CS寄存器用于取指堆栈堆栈段SS寄存器所有的堆栈的进栈和出栈。任何使用BP,ESP或ESP作为基址寄存器的访存。局部数据数据段DS寄存器除相对于堆栈以及串处理指令的目的串以外的所有数据访问目的串附加数据段ES寄存器串处理指令的目的串21跨段越问题凡是使用寄存器为BX、SI、DI时,其默认段为DS,使用BP时,默认段为SS。该规定为系统默认状态。当要否定默认状态,到非约定段寻找操作数时,必须用跨段前缀指明操作数的段寄存器名。汇编格式:段寄存器名:操作数地址。功能:冒号“:”之前的段寄存器名指明操作数所在的段。【例3.8】MOVAX,DS:[BP]MOVCX,SS:[SI]

该例中,DS:,SS:均为跨段前缀,此时默认状态无效,操作数的物理地址PA由段寄存器内容左移4位加偏移EA形成。上述2条指令的源操作数物理地址分别为:

PA1=(DS)左移4位+[BP]PA2=(SS)左移4位+[SI]22不允许使用段跨越前缀的3中情况串处理指令的目的串必须用ES段;PUSH指令的目的操作数和POP指令的源操作数必须用SS段指令必须存放在CS段中。23

3)

直接寻址方式定义:操作数的有效地址只包含位移量一种成分,其值存放在代码段中指令的操作码之后,即指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。

EA指令操作数存储器+段基地址功能:指令下一字单元的内容是操作数的偏移地址EA。图形表示:24例:MOVAX,[2000H]EA=2000H,假设(DS)=3000H,那么PA=32000H.如图:25【例3.3】执行指令:MOVBX,[1234H]

设(DS)=2000H。执行后:(BX)=?BXDS:2000H+1234H21234HOP~~~~…CS→DS→13H52H20000H21234H……34H12H执行:(21234H)→BX执行后:(BX)=5213H135226

在通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接形成,但如果使用段超越前缀,那么,操作数可存放在其它段。例如:MOV

ES:[1000H],AX27注意:立即数寻址方式和直接寻址方式的书写格式不同,直接寻址的地址要写在括号“[]”内。在程序中,直接地址通常用内存变量名来表示,如:MOVBX,VALUE,其中,VALUE是内存字变量。MOVAX,1234H

MOVAX,[1234H]

前者是立即寻址,后者是直接寻址MOVAX,VALUE

MOVAX,[VALUE]

两者是等效的,均为直接寻址作业试比较下列指令中源操作数的寻址方式(VALUE是内存字变量)符号地址288086为了使指令字不要过长,规定双操作数指令的两个操作数中,只能有一个使用存储器寻址方式,这就是一个变量常常先要送到寄存器的原因。294)

寄存器间接寻址方式定义:操作数在存储器中,操作数的有效地址由基址寄存器(BX,BP)或变址寄存器(SI,DI)

指定,称这种寻址方式为寄存器间接寻址方式。

EA寄存器操作数存储器+段基地址基址或变址寄存器指令汇编格式:[R]功能:操作数存放在存储器,寄存器R存放操作数的偏移地址EA。图形表示:30寄存器:16位寻址时可用BX,BP,SI,DI.32位寻址时可用EAX,EBX,ECX,EDX,ESP,EBP,ESI,EDI.注意:BP,ESP,EBP,默认是SS段。其他寄存器默认是DS段。31【例3.4】假设有指令:MOVBX,[DI],在执行时,(DS)=1000H,(DI)=2345H,存储单元12345H的内容是4354H。问执行指令后,BX的值是什么?BX

DS:1000H+DI:2345H12345H解:寄存器DI的值不是操作数,而是操作数的地址。该操作数的物理地址应由DS和DI的值形成,即:

PA=(DS)*16+DI=1000H*16+2345H=12345H。该指令的执行效果是:把从物理地址为12345H开始的一个字的值传送给BX。4354…OP…~~~~…CS→DS→54H43H10000H12345H32在不使用段超越前缀的情况下,有下列规定:若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。该寻址方式物理地址的计算方法如下:

BX物理地址PA=16×DS+SI DI或物理地址PA=16×SS+BP335.寄存器相对寻址方式定义:操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容和指令中的8位/16位偏移量之和。

汇编格式:X[R]或者[R+X](X表示位移量,是8位或16位二进制补码表示的有符号数)功能:操作数存放在存储器,寄存器R的内容加位移量X为操作数的偏移地址EA。图形表示如下:地址寄存器操作数存储器+段基地址基址或变址寄存器位移量指令+EA34【例3.5】假设指令:MOVBX,[SI+100H],在执行时,(DS)=1000H,(SI)=2345H,内存单元12445H的内容为2715H,问该指令执行后,BX的值是什么?…OP…~~~~…CS→DS→15H27H10000H12445HSI:2345H+100HEA:2445H+DS:1000H12445H2715BX所以,该指令的执行效果是:把从物理地址为12445H开始的一个字的值传送给BX。解:EA=(SI)+100H=2345H+100H=2445H

PA=(DS)*16+EA=1000H*16+2445H=12445H。35寄存器相对寻址方式

MOVAX,COUNT[SI]或MOVAX,[COUNT+SI]MOVBX,[SI+100H]MOVBX,100H[SI]366.基址变址寻址方式定义:操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。

汇编格式:

[BR+IR]或者[BR][IR]功能:操作数存放在存储器,BR的内容加IR的内容是操作数的偏移地址EA。图形表示:操作数存储器+段基地址基址寄存器变址寄存器指令+基址值基址寄存器变址值变址寄存器EA37【例3.6】假设指令:MOVBX,[BX+SI],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0011H,内存单元12111H的内容为1234H。问该指令执行后,BX的值是什么?…OP…~~~~…CS→DS→34H12H10000H12111HBX:2100H+SI:0011HEA:2111H+DS:1000H12111H1234BX所以,该指令的执行效果是:把从物理地址为12111H开始的一个字的值传送给BX。解:操作数的物理地址PA为:

PA=(DS)*16+(BX)+(SI)

=1000H*16+2100H+0011H=12111H387.相对基址变址寻址方式定义:操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和。

汇编格式:X[BR+IR]功能:操作数存放在存储器,BR内容加IR内容加位移量X是操作数的偏移地址EA。图形表示:存储器基址值基址寄存器操作数+段基地址基址寄存器变址寄存器位移量指令+变址值变址寄存器EA39【例3.7】假设指令:MOVAX,[BX+SI+200H],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0010H,内存单元12310H的内容为1234H。问该指令执行后,AX的值是什么?解:该操作数的物理地址应由DS和EA的值形成,即:PA=12310H所以,该指令的执行效果是:把从物理地址为12310H开始的一个字的值传送给AX。…OP…~~~~…CS→DS→34H12H10000H12310H

BX:2100HSI:0010H

0200HEA:2310H+DS:1000H12310H1234AX40EA=(基址寄存器)+(变址寄存器)

比例因子+位移量对于元素大小为2、4、8字节的数组,可以在变址寄存器中给出数组元素下标,而由比例因子将下标转换为变址值。8比例变址寻址方式4180x86新增的寻址方式

EA=(基址寄存器)+(变址寄存器)

比例因子+位移量(1)比例变址寻址方式

例:MOVEAX,COUNT[ESI

4]42(2)基址比例变址寻址方式

例:MOVECX,[EAX][EDI

4]

(3)相对基址比例变址寻址方式

例:MOVEAX,TABLE[EBP][EDI

4]▲16位和32位寻址的差异地址成分16位寻址32位寻址基址寄存器BX、BP任何32位通用寄存器变址寄存器SI、DI除ESP外的任何32位通用寄存器比例因子11、2、4、8433.1.2与转移地址有关的寻址方式

用来确定转移指令及转子(call)指令的转向地址。转向地址是由各种寻址方式得到的有效地址和段地址相加而成的,有效地址存入IP寄存器中,段地址指定为CS段寄存器内容。

段内寻址段内直接寻址JMPNEARPTRNEXT

段内间接寻址JMPTABLE[BX]

段间寻址

段间直接寻址JMPFARPTRNEXT

段间间接寻址JMPDWORDPTR[BX]44(1)段内直接寻址转向的有效地址=当前(IP)+位移量(8bit/16bit)

位移量IP寄存器+EA45【例3.8】

(1)JMPSHORTQUEST

其中QUEST表示转移的符号地址,操作符SHORT表示是个8位带符号数,数的范围是80H~7FH,即-128~+127。它只能相对于当前IP(转移指令的下一条指令的首地址)所指的位置作-128~+127范围内跳转,所以称为短跳转。(2)JMPNEARPTRPROGA

其中PROGA表示转移的符号地址,操作符NEARPRT表示是个16位带符号数,数的范围是8000H~7FFFH,即-32768~+32767。它只能相对于当前IP所指的位置作-32768~+32767范围内跳转,所以称为近跳转。46(2)段内间接寻址

转向的有效地址是一个寄存器或存储单元的内容。可用除立即数以外的任何一种数据寻址方式得到,所得到的转向的有效地址取代IP寄存器的内容。转向的有效地址指令数据寻址方式或根据数据寻址方式计算出EA值转向的有效地址存储单元47

【例3.9】

已知(DS)=2000H,(BX)=1256H,(SI)=528FH,位移量=20A1H

,(232F7H)=3280H,(264E5H)=2450H

JMPBXJMPWORDPTRTABLE[BX]JMPWORDPTR[BX][SI](IP)=1256H(IP)=3280H(IP)=2450H48(3)段间直接寻址用指令中提供的转向段地址和偏移地址取代CS和IP。指令偏移地址IP寄存器段地址CS寄存器49【例3.9】JMPFARPTRNEXTROUNT32EA010010~~~~10CS=0000HCS→0000002000IP→IP=2000HCS→CS=1000HNEXTROUNTIP=0132H1013210000新IP新CS50(4)段间间接寻址用存储器中的两个相继字的内容取代CS和IP,存储单元的地址可用存储器寻址方式得到。

指令数据寻址方式根据数据寻址方式计算出EA值转向的有效地址转向的有效地址存储器中的两个相继字IPCS51【例3.10】JMP

DWORDPTR[INTERS+BX]

如DS=3000H,BX=1200H,INTERS=0020H,

指令执行前,CS=0000H,IP=1000H,(31220H)=40H

(31221)=01H,(31222H)=00H,(31223)=10H。

指令执行后,CS=1000H,IP=0140H则存储单元的物理地址:PA=30000+0020+1200=31200H52指令存储和执行情况:JMPDWORDPTRINTER[BX]~~~~CS=0000HCS→0000001000IP→IP=1000HCS→CS=1000HIP→IP=0140H1014010000代码段01400010DS=3000HDS→3000031220INTER+BX数据段新IP新CS312213122231223533.2程序占有的空间和执行时间543.380x86的指令系统

80X86指令系统分为以下6组:

数据传送指令

串处理指令

算术指令

控制转移指令

逻辑指令

处理机控制与杂项操作指令

对指令要掌握以下几个方面内容:指令的功能、注意事项;指令操作数的寻址方式;指令对标志位的影响、标志位对指令的影响;553.3.1数据传送指令

数据传送指令负责把数据、地址或立即数传送到寄存器、存储器或端口号寄存器。它相对于高级语言里的赋值语句。

通用数据传送:MOV

PUSHPOPXCHG累加器专用传送(输入输出):IN

OUTXLAT地址传送:LEA

LDSLES标志寄存器传送:LAHF

SAHF

PUSHF

POPF类型转换指令:CBWCWD56通用数据传送指令MOVMOVSXMOVZXPUSHPOPPUSHA/PUSHADPOPA/POPADXCHG该组指令不影响标志位。57MOV传送指令格式:MOV

DST,

SRC功能:指令的功能是把源操作数(第二操作数)的值传给目的操作数(第一操作数)。指令执行后,目的操作数的值被改变,而源操作数的值不变。在存储单元是该指令的一个操作数时,该操作数的寻址方式可以是任意一种存储单元寻址方式。58段寄存器CS、DS、SS、ES通用寄存器8位或者16位存储器立即数8位或者16位

在汇编语言中,主要的数据传送方式如下图所示。虽然一条MOV指令能实现其中大多数的数据传送方式,但也存在MOV指令不能实现的传送方式。59MOV指令的机器语言有7种格式1、MOVmem/reg1,mem/reg22、MOVreg,data3、MOVac,mem4、MOVmem,ac5、MOVsegreg,mem/reg6、MOVmem/reg,segreg7、MOVmem/reg,data60Reg8

AHALBHBLCHCLDHDLReg16

AXBXCXDXSIDIBPSPReg32

EAXEBXECXEDXESIEDIEBPESPSegreg

CSDSSSESFSGS61

对MOV指令有以下几条具体规定,其中有些规定对其它指令也同样有效。(1)两个操作数的数据类型要相同,要同为8位、16位,如:MOV

BL,AX等是不正确的;(2)两个操作数不能同时为段寄存器,如:MOV

ES,DS等;(3)代码段寄存器CS不能为目的操作数,但可作为源操作数,如:指令MOV

CS,AX等不正确,但指令MOV

AX,CS等是正确的;(4)立即数不能直接传给段寄存器,如:MOV

DS,100H等;(5)立即数不能作为目的操作数,如:MOV

100H,AX等;(6)指令指针IP,不能作为MOV指令的操作数;(7)两个操作数不能同时为存储单元,如:MOV

[SI],[DI]等,62DST与SRC必须类型匹配,即同时是字节、字或双字类型。以下几点要注意:

寄存器具有明确的类型,如AL,AX

立即数没有明确的类型,MASM负责将立即数零扩展与目的操作数位数相同;但有时MASM不能确定内存操作数的类型,需要用Byteptr,Word

ptr和Dword

ptr明确指出操作类型。Movbyteptr[bx],0Mov[bx],0

两个操作数只要其中一个操作数的类型确定即可。63MOVdl,05hMovdx,05hMovedx,05hMov

eax,ecxMov

al,[bx]Mov

ax,[bx]MOVax,dlMovds,1000hMov[bx],[si]Mov

es,csMov

cs,axMov[bx],0Movbyteptr[bx],064例2:

MOVAL,‘E’把立即数送到AL寄存器。例1:MOVAX,DATA_SEGMOVDS,AX把数据段DATA_SEG的首地址送到DS寄存器。区别于:MOVBX,LIST例3:

MOVBX,OFFSETLIST把LIST的偏移地址(不是内容)送到BX寄存器。65例4:MOVAX,Y[BP][SI]

例5:

MOVEAX,[EBX+ECX*4]662.MOVSX带符号扩展传送指令格式:MOVSX

DST,SRC两种格式:MOVSXreg1,reg2MOVSXreg,mem传送时把原操作数符号扩展送入目的操作数。67例3.25

MOVSXEAX,CL把CL寄存器中的8位数,符号扩展为32位,送到EAX。例3.26MOVSXEDX,[EDI]683.MOVZX带零扩展传送指令格式:MOVSX

DST,SRC两种格式:MOVSXreg1,reg2MOVSXreg,mem69MOVSX和

MOVZX区别:MOVSX的源操作数是带符号数,所以做符号扩展;MOVZX的源操作数是无符号数,所以做零扩展70MOVSX和

MOVZX与一般双操作数指令的区别:一般双操作数指令的源操作数和目的操作数的长度一致;MOVSX和

MOVZX的源操作数长度一定要小于目的操作数长度。71例3.27MOVZXDX,AL例3.28MOVZXEAX,DATA72PUSH进栈指令

堆栈是一个重要的数据结构,它具有“先进后出”的特点,通常用来保存程序的返回地址。它主要有两大类操作:进栈操作和出栈操作。

指令格式:PUSH

Reg/Mem

一个字进栈,系统自动完成两步操作(操作数16位)

SP←SP-2,(SP)←操作数;功能:将寄存器、段寄存器或存储器中的一个字数据压入堆栈,堆栈指针减2。操作数32位,SP→ESP73POP进栈指令指令格式:POP

Reg/Mem

弹出一个字,系统自动完成两步操作

(操作数16位)

操作数←(SP),SP←SP+2;

功能:将栈顶元素弹出送至某一寄存器、段寄存器(除CS外)或存储器,堆栈指针加2。74PUSH指令的四种格式PUSHreg/mem/data/segreg8086不允许PUSH使用立即数寻址POP指令格式POPreg/mem/segreg

POP指令不允许使用立即数寻址方式75注意:PUSHSP

该指令入栈的是已修改了的sp的新值。

PUSHESP

该指令入栈的是执行该指令之前的旧值。76【例】PUSHAX2816A7SS=5000HSS→50000堆栈段525005250152502SP=2500HSP→2107AX2816A7SS=5000HSS→50000堆栈段525005250152502

2107AX0721524FF524FE(1)执行前(2)执行后SP→SP=24FEH操作数为32位,????77堆栈段2107SP=24FEH操作数为32位,????【例】POPAX2816A7SS=5000HSS→50000525005250152502

524FF524FE(2)执行前SP→07212816A7SS=5000HSS→50000525005250152502SP=2500HAX(1)执行后SP→78例3.31PUSH[EAX]例3.32PUSH12H286以后的机器允许使用。79PUSHA/PUSHAD所有寄存器进栈指令PUSHA:16位通用寄存器依次进栈,次序:AX,CX,DX,BX,指令执行前的SP,BP,SI,DI.指令执行后(SP)(SP)-16PUSHAD:32位通用寄存器依次进栈,次序:EAX,ECX,EDX,EBX,指令执行前的ESP,EBP,ESI,EDI.指令执行后(SP)(SP)-3280POPA/POPAD所有寄存器出栈指令POPA:16位通用寄存器依次出栈,次序:DI,SI,BP,SP,BX,DX,CX,AX.指令执行后(SP)(SP)+16说明:sp的出栈只是修改了指针使其后的BX能顺利出栈,sp原始内容被丢弃。81PUSHAD:32位通用寄存器依次进栈,次序:EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX.指令执行后(SP)(SP)+32仍指向栈顶。82

XCHG:交换指令指令格式:

XCHGoprd1,oprd2;

交换两个操作数的内容。语法格式:

XCHGREG/MEM,REG/MEM对标志位的影响:无说明:操作数至少有一个为寄存器。83例XCHGBX,[BP+SI](BX)=6F30H,(BP)=0200H,(SI)=0046H(SS)=2F00H,(2F246H)=4154H

OPR2的物理地址=2F000+0200+0046=2F246H指令执行后,(BX)=4154H(2F246H)=6F30H84XCHGEAX,EBX85IN输入OUT输出XLAT换码

这组指令只限于使用累加器EAX,AX或AL传送信息。指令不影响标志位2累加器传送指令86IN输入指令

输入指令用来从指定的外设寄存器取信息送入累加器。它有几种形式:

长格式:

INAL,PORT(字节)

INAX,PORT(字)

INEAX,PORT(双字)执行操作:(AL)(PORT)(字节)(AX)(PORT+1,PORT)(字)

短格式:

INAL,DX(字节)

INAX,DX(字)

INEAX,DX(字)执行操作:(AL)((DX))(字节)(AX)((DX)+1,(DX))(字)87OUT输出指令

长格式:

OUTPORT,AL

(字节)

OUTPORT,AX

(字)

OUTPORT,EAX

(双字)执行操作:(PORT)(AL)(字节)

(PORT+1,PORT)(AX)(字)短格式:

OUTDX,AL

(字节)

OUTDX,AX

(字)

OUTDX,EAX

(双字)执行操作:((DX))(AL)(字节)

((DX)+1,(DX))(AX)(字)输出指令用来把累加器的内容送往指定的外设存储器,它有几种形式:88

该指令的作用是从端口中读入一个字节或字,并保存在寄存器AL或AX中。如果某输入设备的端口地址在0~255(0~FFH)范围之内,那么,可在指令IN中直接给出(指令的长格式),否则,要把该端口地址先存入寄存器DX中,然后在指令中由DX来给出其端口地址(0000~FFFFH)(短格式)。89例如INAX,28HMOVDATA_WORD,AX功能:将端口28的内容传送到存储单元DATA_WORD中。MOVDX,3FCH;把端口号放入DX中。INAL,DX;从端口3FCH读入一个字节到AL中INEAX,DX;从端口3FCH读入一个双字到EAX90例如:OUT5,AL;把AL的内容输出到端口5中OUT20H,AX;把AX的内容输出到端口20H、21H中MOVDX,3C0HOUTDX,AL;把AL的内容输出到端口3C0H中OUTDX,AX;把AX的内容输出到端口3C0H、3C1H中91XLAT换码指令转换指令有两个隐含操作数BX和AL。格式:XLATOPR

或XLAT执行操作:(AL)((BX)+(AL))功能:其功能是把BX的值作为内存字节数组首地址、位移量为AL的数组元素的值传送给AL。92例:MOVBX,offsettable;

MOVAL,3XLAT

32H31H33HDS=F000HDS→数据段F0040F0041

(Ax)=3table30H(BX)→F0042F0043把BX的值作为内存字节数组首地址、下标为AL的数组元素的值传送给AL。

指令执行后(AL)=33H(BX)=0040HAL:03H33H93地址传送指令LEALDSLESLSSLFSLGS这一组指令完成把地址送到指定寄存器的功能。指令不影响标志位。94取有效地址指令LEA:功能:把一个内存变量的有效地址送给指定的寄存器。指令格式:

LEA

Reg,Mem

例1:LEABX,[BX+SI+0F62H]

如指令执行前(BX)=0400H,(SI)=003CH,

指令执行后(BX)=0400+003C+0F62=139EH例2:LEABX,

LIST MOVBX,OFFSETLIST95取段寄存器指令LDS,LES,LSS,LFS,LGS:指令格式如下:

LDS/LES

Reg,SRC执行操作:(REG)

(SRC)

(SREG)

(SRC+2)或 (SREG)

(SRC+4)功能:把内存单元的一个“低字”传送给指令中指定的16位寄存器,把随后的一个“高字”传给相应的段寄存器(DS、ES)。96例1:LESDI,[BX]指令执行前(DS=B000H,(BX)=080AH,(0B080AH)=05AEH,(0B080CH)=4000H指令执行后(DI)=05AEH,(ES)=4000H例2:LSSESP,MEM97MOVBX,TABLE

;MOVBX,OFFSETTABLE

;LEABX,TABLE

;LDSBX,TABLE

;

;LESBX,TABLE

;

;40H00H00H30HTABLE3000H:1000H→(BX)=0040H(BX)=0040H(ES)=3000H(BX)=0040H(DS)=3000H(BX)=1000H(BX)=1000H98标志寄存器传送指令LAHF(loadAHwithflags)标志送AHSAHF(storeAHintoflags)AH送标志寄存器PUSHF/PUSHFD标志进栈POPF/POPFD标志出栈

99标志寄存器传送指令1.标志送AH指令:

LAHF

执行操作:(AH)

(FLAGS的低字节)

2.AH送标志寄存器指令:SAHF执行操作:(FLAGS的低字节)(AH)

3.标志进栈指令:PUSHF

执行操作:(SP)(SP)-2

((SP)+1,(SP))(FLAGS)4.标志出栈指令:POPF执行操作:(FLAGS)((SP)+1,(SP))(SP)

(SP)+2100类型转换指令CBW字节转换为字CWD字转换为双字CDQ双字转换为四字BSWAP字节交换指令不影响标志位101类型转换指令

CBW

执行操作:AL

AX

若(AL)的最高有效位为0,则(AH)=00H

若(AL)的最高有效位为1,则(AH)=FFH

例:(AX)=0BA45H

CBW;(AX)=0045H

CWD;(DX)=0FFFFH(AX)=0BA45H

CWD

执行操作:AX

(DX,AX)

若(AX)的最高有效位为0,则(DX)=0000H

若(AX)的最高有效位为1,则(DX)=FFFFH102

(3)CDQ双字转换成四字指令(4)BSWAPr32字节交换指令操作:使指令指定的32位寄存器的字节次序变反,1、4字节互换,2、3字节互换。例:BSWAPEAX指令执行前(EAX)=11223344H指令执行后(EAX)=44332211H字节次序变反。1033.3.2算术指令

算术运算指令是反映CPU计算能力的一组指令,也是编程时常使用的一组指令。它包括:加、减、乘、除及其相关的辅助指令。该组指令的操作数可以是8位、16位、32位。当存储单元是该类指令的操作数时,该操作数的寻址方式可以是任意一种存储单元寻址方式。104算术指令加法指令

ADD、ADC、INC减法指令

SUB、SBB、DEC、NEG、CMP乘法指令

MUL、IMUL除法指令

DIV、IDIV105加法指令ADD(add)加法ADC(addwithcarry)带进位加法INC(increment)加1XADD(exchangeandadd)交换并相加106ADD加法指令

1.一般形式:

ADDDST,SRC;(

DST)

(SRC)+(DST)

2.语法格式:

ADDreg/mem,reg/mem/imm

3.对条件标志位的影响:

按一般规则影响CF,

OF,

SF和ZF两个操作数必须类型匹配,且不能同时是内存操作数。107ADC带进位加法指令

1.一般形式:

ADCDST,SRC;(DST)

(SRC)+(DST)+CF

2.语法格式:

ADCreg/mem,reg/mem/imm;同ADD

3.对标志位的影响:

按一般规则影响CF,OF,SF和ZF;同ADD两个操作数必须类型匹配,且不能同时是内存操作数。108INCOPR:加1指令

1.一般形式:

INCDST;(DST)

(DST)+1

2.语法格式:

INC

reg/mem

3.对标志位的影响:

不影响CF,其它同ADD109XADD交换并相加指令

1.一般形式:

XADDDST,SRC;TEMP

(SRC)+(DST)

(SRC)

(DST)

(DST)

TEMP

2.语法格式:

XADDreg/mem,reg/mem/imm;同ADD

3.对标志位的影响:

按一般规则影响CF,OF,SF和ZF;同ADD只能用于486以后的及其以后的机型两个操作数必须类型匹配,且不能同时是内存操作数。110加法指令对条件标志位(SF、ZF、CF、OF)的影响1最高位向前有进位0否则CF=1两个数同号,而相加结果与之异号0否则OF=SF:最高位为1,则SF=1.否则SF=0ZF:结果为0.则ZF=1.否则ZF=0.OF: 表示带符号数的溢出CF:表示无符号数的溢出111ADDDX,0F0F0H(DX)=4652H例1:ZF=0,SF=0,CF=1,OF=0指令执行后,(DX)=3742H,112例2:下列指令序列可在8086和80286中实现两个双精度数的加法。设目的操作数存放在DX和AX寄存器中,其中DX存放高位字。源操作数存放在BX、CX中,其中BX存放高位字。如指令执行前:(DX)=0002H,(AX)=0F365H,(BX)=0005H,(CX)=0E024H指令序列为ADDAX,CX ADCDX,BX第一条指令(AX)=0D389H,SF=CF=1,ZF=OF=0第二条指令(DX)=0008H,SF=0,ZF=0,CF=0,OF=0113例3:XADDBL,DL指令执行前(BL)=12H,(DL)=02H指令执行后 (BL)=14H,(DL)=12H+1114减法指令SUB减法SBB带借位减法DEC减1NEG求补CMP比较CMPXCHG比较并交换CMPXCHG8B比较并交换8字节115SUB减法指令

1.一般形式:

SUBDST,SRC;(DST)

(DST)-(SRC)

2.语法格式:

SUBreg/mem,reg/mem/imm

3.对标志位的影响:

按一般规则影响CF,OF,SF和ZF两个操作数必须类型匹配,且不能同时是内存操作数。116SBB带借位减法指令

1.一般形式:

SBBDST,SRC;(DST)

(DST)-(SRC)-CF

2.语法格式:

SBBreg/mem,reg/mem/imm

3.对标志位的影响:

按一般规则影响CF,OF,SF和ZF两个操作数必须类型匹配,且不能同时是内存操作数。117DEC减1指令

1.一般形式:

DECDST;(DST)

(DST)-1

2.语法格式:

DECreg/mem

3.对标志位的影响:不影响CF,其它同SUB118NEG求补指令(求相反数)1.一般形式:

NEGDST;(DST)

-(DST)

2.语法格式:

NEGreg/mem

3.对标志位的影响:

按一般规则影响CF,OF,SF和ZF119CMP比较指令

1.一般形式:

CMPDST,SRC;(DST)-

(SRC)

2.语法格式:

CMPreg/mem,reg/mem/imm

3.对标志位的影响:

按一般规则影响CF,OF,SF和ZF两个操作数必须类型匹配,且不能同时是内存操作数。120CMP比较指令

该指令与SUB指令一样执行,但它不保存结果。只是根据结果设置条件标志位。

CMP指令后往往跟着一条条件转移指令,根据比较结果产生不同的程序分支。两个操作数必须类型匹配,且不能同时是内存操作数。121CMPXCHG比较并交换指令

1.一般形式:

CMPXCHGDST,SRC;

执行的操作:累加器AC与DST相比较,如果(AC)=(DST),则ZF

1,(DST)

(SRC)否则,ZF

0,(AC)

(DST)

只能用于486以后的机型。122CMPXCHG8B比较并交换8字节指令

1.一般形式:

CMPXCHG8BDST

执行的操作:EDX,EAX与DST相比较,如果(EDX,EAX)=(DST),则ZF

1,(DST)

(ECX,EBX)否则,ZF

0,(EDX,EAX)

(DST)

奔腾以后的机型。123减法指令对条件标志位的影响:1被减数的最高有效位有向高位的借位0否则CF=1两个操作数符号相反,而结果的符号与减数相同0否则OF=SF:最高位为1,则SF=1.否则SF=0ZF:结果为0.则ZF=1.否则ZF=0.124【例1】

SUB[SI+14H],0136H

指令执行前

(DS)=3000H,(SI)=0040H,

(30054H)=4336H(30054H)=4200H,SF=0,ZF=0,CF=0,OF=0125【例2】

SUBDH,[BP+4]

执行前(DH)=41H,(SS)=0000H,

(BP)=00E4H,(000E8)=5AH(DH)=0E7H,SF=1,ZF=0.CF=1.OF=0126X,Y,Z,均为双精度数,它们分别存放在地址为X,X+2;Y,Y+2;Z,Z+2的存储单元中,存放时高位字在高地址中,低位字在低地址中。在8086和80286中可用下列指令序列实现。wX+Y+24-Z参考指令序列:MOVAX,XMOVDX,X+2ADDAX,YADCDX,Y+2ADDAX,24ADCDX,0SUBAX,ZSBBDX,Z+2MOVZ,AXMOVZ+2,DX127例3.51CMPXCHGCX,DX如指令执行前:(AX)=2300H,(CX)=2300H,(DX)=2400H指令执行后:因(CX)=(AX)故(CX)=2400H,ZF=1如指令执行前:(AX)=2500H,(CX)=2300H,(DX)=2400H指令执行后:因(CX)≠(AX)故(AX)=2400H,ZF=0128乘法指令MUL无符号数乘法IMUL带符号数乘法129MUL:无符号数乘法

1.一般形式:

MULSRC;

2.语法格式:

MUL

reg8/mem8;AX=AL*SRCMUL

reg16/mem16;DX:AX=AX*SRCMUL

reg32/mem32;EDX:EAX=EAX*SRC

3.对标志位的影响:

若结果的高一半为0,则CF=OF=0,否则,CF=OF=1;其余标志无定义。指令执行后这些条件标志位的状态不确定。130IMUL:有符号数乘法

1.一般形式:

IMULSRC;

2.语法格式:

IMUL

reg8/mem8;AX=AL*SRCIMUL

reg16/mem16;DX:AX=AX*SRCIMUL

reg32/mem32;EDX:EAX=EAX*SRC

3.对标志位的影响:若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为

CF=OF=1;其余标志无定义。131

乘法指令如下影响OF和CF标志:

MUL指令——若乘积的高一半(AH或DX)为0,则OF=CF=0;否则OF=CF=1。(用来检查字节相乘的结果是字节还是字,或字相乘的结果是字还是双字)

IMUL指令——若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1。乘法指令对其他状态标志没有定义:指令执行后这些标志是任意的、不可预测(就是谁也不知道是0还是1)。对标志没有影响是指令的执行不改变标志的状态。132例:MOVAL,0B4HMOVBL,11HMULBLMOVAL,0B4HMOVBL,11HIMULBLOF=CF=1AX=FAF4H=-1292DBL=11H=17DAL=B4H=-76DOF=CF=1;AX=OBF4H=3060DBL=11H=17DAL=B4H=180D1334.除法指令

无符号数除法指令:

DIVSRC执行操作:字节操作(AL)

(AX)/(SRC)的商(AH)

(AX)/(SRC)的余数字操作(AX)

(DX,AX)/(SRC)的商(DX)

(DX,AX)/(SRC)的余数注意:除法指令对所有条件标志位无定义。但可产生溢出。134双字操作(EAX)

(EDX,EAX)/(SRC)的商(EDX)

(EDX,EAX)/(SRC)的余数商和余数都是无符号数135

带符号数除法指令:

IDIVSRC执行的操作:与DIV相同,但操作数必须是带符号数,商和余数也都是带符号数,且余数的符号和被除数的符号相同。136注意:由于除法指令的字节操作要求被除数为16位,字操作要求被除数为32位,双字操作要求被除数为64位,因此需要用符号扩展的方法取得出发指令所需要的被除数格式。

137例:MOVAX,0400H;AX=400H=1024DMOVBL,0B4H;BL=B4H=180DDIVBL;商AL=05H=5D;余数AH=7CH=124MOVAX,0400H;AX=400H

温馨提示

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

评论

0/150

提交评论