8086寻址方式与指令系统课件_第1页
8086寻址方式与指令系统课件_第2页
8086寻址方式与指令系统课件_第3页
8086寻址方式与指令系统课件_第4页
8086寻址方式与指令系统课件_第5页
已阅读5页,还剩176页未读 继续免费阅读

下载本文档

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

文档简介

8086寻址方式与指令系统4.1.1汇编语言与机器语言

我们已经学过高级语言,例如BASIC语言或FORTRAN语言,无论哪种语言,它都规定了一系列用于编写程序的语句和应该遵循的语法规则。人们根据一种语言给定的语句及其语法规则就可以写出程序,计算机则通过执行已编好的程序来完成人们要求它完成的各种复杂功能。汇编语言也一样,根据汇编语言的语句及其语法规则可以写出汇编语言程序。但汇编语言与高级语言有较大的区别,汇编语言中的语句与机器的种类和型号密切相关。§4.1汇编语言及汇编程序的基本概念

在高级语言中,完成某个加法功能,我们可采用语句X=A+B,只要给变量A和B赋一确定值,此加法就可以实现了。在汇编语言中则不同,程序必须指出A,B存放在何处,相加后的结果又存放在何处,然后才能实现这一加法运算。显然,汇编语言在通过程序告诉计算机做什么和如何做时,显得更加具体。正是这种具体,使得该语言与计算机(处理器)紧密相关,从而也要求学习和使用汇编语言的人对处理器的结构有更加深入的了解。那么,什么是机器语言,汇编语言与机器语言之间又有什么关系呢?我们说,机器语言是这样一种语言,它的每条语句就是计算机可以直接执行的一条指令,这些指令以二进制码的形式表示。例如我们要将累加器AX中加上一个常数02,其二进制码表示的指令为:

000001010000001000000000。也就是说,当处理器中取得了这样一组指令代码时,它将自动地完成(AX)+2→(AX)中的操作。处理器所以能这样是因为处理器在设计时,就考虑了这样一组代码应完成的功能。自然,不同的处理器,指令的机器码将各不相同,完成的具体功能也将各不相同。采用机器语言编写程序的一个最大好处是,程序送入计算机后,可以直接执行。但是,我们很快会感觉到,采用机器语言编写程序是多么困难,既不易书写,也不易检查。汇编语言正是为了克服这一缺点而形成的一种与机器语言直接相关的语言。汇编语言的基本思想是采用一组字母、数字或符号来代替一条二进制码表示的指令,例如上面所述的指令可采用字符ADDAX,02来代替,它表示将累加器AX中的内容加上一个常数02。显然,这要比一串二进制码清晰多了,既容易书写,也容易记忆。

表示一条指令的这些字符常称为助记符。我们必须指出,采用助记符写出的程序,机器是不能直接执行的,因为上面我们已经指出,处理器在设计时是按二进制指令码考虑的。所以,采用汇编语言编写的程序在执行前还必须将其“翻译”成机器语言。通常将采用助记符指令写成的程序,称为源程序,将它翻译成的机器语言程序称为目标程序。将汇编语言的源程序翻译成目标程序的过程称为汇编过程或简称汇编。汇编过程通常是由计算机完成的。它是通过执行一个专门完成汇编的软件——称为汇编程序来实现的。既然写出的源程序要由汇编程序将其翻译后才能执行,所以,我们编写的源程序必须符合汇编程序的一系列要求或者规则,只有这样,你的程序才能被正确地“翻译”。

所以,汇编语言的一系列规则是与“翻译”软件——汇编程序相关的。汇编语言的语句有两种基本类型,即指令与伪指令。指令可由汇编程序翻译成机器语言指令,例如上例中的ADDAX,02,汇编后将形成一条机器语言指令050200(十六进制码),所以,汇编语言中的指令与机器语言指令基本上是一一对应的。伪指令则不汇编成机器语言指令,仅仅在汇编过程中告诉汇编程序应如何汇编。例如告诉汇编程序已写出的汇编语言源程序有几个段,段的名称是什么,是否采用过程,汇编到某处是否需要留出存储空间,应留多大,是否要用到外部变量等。

所以,伪指令是为汇编程序在汇编时用的。但指令与伪指令都是组成汇编语言源程序的基本语句。除了这两类基本语句外,在汇编语言中,还存在另一类指令称为宏指令,它是使用者利用上述基本语句自己定义的新的指令。4.1.2各种计算机语言的比较

机器语言

用机器码表示,例如B8H、C3H。

汇编语言

用指令助记符表示机器码,例如对应于机器码B8H、C3H的助记符为MOVAX,BX。

CPU不同,机器码不同,助记符也不同。

高级语言

语言规范,可移植。4.1.3汇编语言与汇编程序

汇编语言→汇编语言源程序

用助记符表示机器码用符号地址表示存储器地址用伪指令管理源程序汇编程序

将汇编语言源程序(简称源程序)编译为机器所能识别的目标代码的系统程序。如MASM.EXE。

汇编语言是一种面向CPU指令系统的程序设计语言,它采用指令系统的助记符来表示操作码和操作数,用符号地址表示操作数地址,因而易记、易读、易修改,给编程带来很大方便。用汇编语言编写的程序能够直接利用硬件系统的特性,直接对位、字节、字寄存器、存储单元、I/O端口等进行处理,同时也能直接使用CPU指令系统和指令系统提供的各种寻址方式编制出高质量的程序,这种程序不但占用内存空间少,而且执行速度快。

1、汇编语言2、汇编程序

用汇编语言编写的源程序在输入计算机后,需要将其翻译成目标程序,计算机才能执行相应指令,这个翻译过程称为汇编,完成汇编任务的程序称为汇编程序。有基本汇编ASM(Assembler)和宏汇编MASM(MacroAssembler)两种。汇编程序以汇编语言源程序文件作为输入,并由它产生两种输出文件:目标程序文件和源程序列表文件。目标程序文件经连接定位后由计算机执行;源程序列表文件将列出源程序、目标程序的机器语言代码及符号表。汇编程序的作用就是把源程序文件(ASM文件)转换成用二进制代码表示的目标程序文件(OBJ文件)。汇编程序的主要功能有:①

检查源程序。②测出源程序语法错误,并给出错误。③

产生目标程序,并可给出列表文件。④

展开宏指令。汇编语言指令的特点语法结构符合人类语言的共同特点——动作+对象指令操作码→动作:做什么?指令操作数→对象:针对什么做动作?机器指令:指令的二进制代码形式。如:89D8H汇编指令:助记符形式的指令。如:MOVAX,BX汇编语言指令操作码助记符:与动作一一对应例: MOVAX,BX目/源操作数:可能有多种组合汇编语言指令操作码:由CPU设计人员定义。每一种操作唯一对应一个操作码。例:加法操作助记符ADD;数据传送操作助记符MOV;比较操作助记符CMP操作数:可由编程人员采用不同方式给出。寻址方式:寻找操作数(操作数地址)的方式;指令格式:指令中对操作码、操作数的编码方式。操作数1.8086指令中操作数的个数可以有以下几种情况无操作数指令,例:等待指令WAIT单操作数指令,例:加1指令INCAL双操作数指令,例:减法指令SUBAL,BL源操作数:后者(BL)目的操作数:前者(AL)2、操作数存放地点,可以有以下几种:

立即数:操作数直接包含在指令中。 例:MOVAL,50H

寄存器操作数:操作数存放在寄存器中。 例:INCAL

内存操作数:操作数存放在内存单元中。 例:MOVAL,[2000H]

I/O操作数:操作数来自I/O端口。例:INAL,28H操作数§4.28086寻址方式给出操作数的可能的方式:由操作码隐含地指定由指令直接给出操作数存放于CPU内部的寄存器中存放于存储器单元内来自I/O端口8086寻址方式(续)非存储器寻址方式存储器寻址方式其它寻址方式—固定寻址、相对寻址、I/O端口寻址

直接寻址寄存器间接寻址基址寻址变址寻址基址加变址寻址

立即数寻址寄存器(直接)寻址实质都是间接寻址

寄存器相对寻址方式(基址加变址相对寻址)8086寻址方式一、非存储器寻址方式(以8086为例,下同)1、立即数寻址方式

源操作数以8位或16位常数的形式直接出现在指令中。一般用于赋值。例:MOVAL,5FH2、寄存器(直接)寻址方式

8位或16位寄存器的值就是操作数本身。与其它寻址方式相比,该方式执行速度最快。例:MOVSI,DX通用寄存器、段寄存器均可

立即数可以用二进制数、八进制数、十进制数以及十六进制数来表示。在非十进制的立即数末尾需要使用字母加以标识。必要情况下,十进制数用字母D加以标识,通常情况下不需要标识。如:

MOVAL,10;十进制数(D)

MOVAL,00100101B;二进制数(B)

MOVAL,0AH;十六进制(H)

8086寻址方式(续)二、存储器寻址方式1、直接寻址方式操作数存放在存储器单元中,由指令直接给出该单元的有效地址EA(即16位段内偏移量)。例:MOVAX,[0016H]寻址过程示意2、寄存器间接寻址方式操作数存放在存储器单元中,指令给出的16位寄存器值就是该单元的EA。例:MOV[BX],CL必须使用BX、BP、SI、DI寻址过程示意直接寻址过程示意图DS(默认段)值0000ES值0000SS值0000CS值0000Bit19430+)0016H:

000000000001011020位物理地址……××××MemoryMOVAX,[0016H]AHAL寄存器间接寻址过程示意图MOV[BX],CL(设BX原值为2010H)DS(BX、SI、DI默认段)0000ES0000SS(BP的默认段)0000CS0000Bit19430+)BX:

001000000001000020位物理地址……××Memory8086寻址方式——基址寻址3、基址寻址方式(寄存器相对寻址方式)使用基址寄存器(BX或BP)、并带位移量的间接寻址。操作数EA=BX或BP值+位移量。例:MOVDL,[BP+2]其它等效写法:

MOVDL,[BP]2MOVDL,2[BP]寻址过程示意

基址寻址过程示意图MOVDL,[BP+2]

(设BP原值为4000H)DS(BX的默认段)值0000ES值0000SS(BP的默认段)值0000CS值0000Bit19430

BP:

0100000000000000+)位移量:00000000

0000001020位物理地址……××Memory8086寻址方式——变址寻址4、变址寻址方式(寄存器相对寻址方式)使用变址寄存器(SI或DI)、并带位移量的间接寻址。操作数EA=SI或DI值+位移量。例:MOV[SI+10],AH其它等效写法:MOV[SI]10,AHMOV10[SI],AH寻址过程示意变址寻址过程示意图MOV[SI]10,AH(设SI原值为008CH)DS(SI、DI默认段)值0000ES值0000SS值0000CS值0000Bit19430

SI:

0000000010001100+)位移量:00000000

0000101020位物理地址……××Memory8086寻址方式——基址加变址寻址5、基址加变址寻址方式使用一个基址寄存器、一个变址寄存器的间接寻址。操作数EA=BX或BP值+SI或DI值(+位移量)。例:MOV[BX+DI+4],CX其它等效写法:MOV[BX+DI]4,CXMOV4[BX+DI],CXMOV[BX][DI]4,CXMOV4[BX][DI],CX寻址过程示意基址加变址寻址过程示意图MOV[BX+DI+4],CX(设BX原值为1000H,DI原值为0300H)DS(BX的默认段)值0000ES值0000SS(BP的默认段)值0000CS值0000Bit19430

BX:0001000000000000DI:0000001100000000+)位移量:00000000

0000010020位物理地址……××××MemoryCHCL段寄存器使用规则直接寻址使用BX、SI、DI的间接寻址使用BP的间接寻址堆栈操作源串指针目标串指针指令指针默认段寄存器DSDSSSSSDSESCS可加的段超越前缀ES:SS:CS:ES:SS:CS:DS:ES:CS:—ES:SS:CS:——固定搭配的寄存器SPSIDIIP

段超越前缀段超越前缀形式为:段寄存器名:例如:当操作数在内存单元时,系统根据隐含约定,自动将寄存器DS或SS的值作为段地址。然而,当操作数段地址不在隐含的段寄存器时,可以使用段超越前缀取代其隐含约定。MOVAX,ES:[BP];段地址在ESMOVAX,CS:[BX][SI];段地址在CS8086寻址方式——其它方式(1)三、其它寻址方式1、固定寻址(隐含寻址)操作数并不直接出现在指令中,而是由操作码隐含地指定为某一固定内容。例:PUSHDS

目操作数隐含为栈顶字单元

POPBX

源操作数隐含为栈顶字单元

LAHF

源操作数隐含为标志寄存器低字节,目操作数隐含为寄存器AH8086寻址方式——其它方式(2)2、相对寻址仅用于进行段内直接转移的控制转移指令。指令中的操作数是一个8位或16位带符号的相对偏移量,代表目标地址与正常执行顺序的原地址之差。

目标地址=顺序执行的原地址+相对偏移量编程时一般使用目标地址的标号作为操作数,不需要计算相对偏移量。例:JNZNEXT8086寻址方式——其它方式(3)3、I/O端口寻址

仅用于I/O指令IN、OUT。长格式I/O寻址——端口地址在8位以内时,用端口地址直接做操作数。可寻址的I/O空间为256字节。例:INAX,43HOUT0FH,AL短格式I/O寻址——端口地址超过8位时,固定使用DX做操作数,DX的值就是该16位端口的地址。可寻址的I/O空间为65536字节。例:INAL,DXOUTDX,AX事先已向DX赋值§4.38086的指令格式指令的书写格式(以8086为例)

操作码助记符[[目操作数助记符],[源操作数助记符]](操作码:必备;操作数:可以是1个、2个或没有;可以是8位或16位)指令的编码格式(以8086为例)采用变长编码格式。低端

高端指令前缀操作码字段寻址方式字段操作数字段1字节1字节1字节1~4字节便于书写可读性强由机器识别和执行4.3.1指令格式

每台计算机都有一套反映该计算机全部功能的指令,它构成了该计算机的指令系统。通常指令以二进制编码的形式存放在存储器中,用二进制编码形式表示的指令称为机器指令。CPU可以直接识别机器指令。对于使用者来说,机器指令记忆、阅读比较困难,为此将每一条指令都用统一规定的符号和格式来表示。用符号表示的指令称为符号指令。符号指令具有直观、易理解、可帮助记忆的特点。汇编语言程序中的指令就是符号指令。在计算机中,符号指令与机器指令具有一一对应的关系。

每条符号指令都由操作码和操作数两部分组成,操作码表示计算机执行某种指令功能,操作数表示操作中所需要的数据或者所需数据与输出数据的存放位置(又称地址码)。低端

高端指令前缀操作码字段寻址方式字段操作数字段1字节1字节1字节1~4字节单字节指令(隐含的操作数)单字节指令(寄存器模式)寄存器到寄存器不带位移量的寄存器和内存之间的传送带位移量的寄存器和内存之间的传送(设位移量为16位)立即数送寄存器(设立即数为16位)立即数送内存(设带16位位移量)

操作码操作码REG操作码操作码操作码操作码操作码11REGR/MMODREGR/MMODREGR/M11REGR/MMOD操作码

R/M位移量低位位移量高位位移量高位位移量低位数据低位数据高位数据高位数据低位REG——寄存器MOD——模式R/M——寄存器或内存1、操作码域:

一般用指令的第一个字节或者头两个字节表示指令的操作码和寻址方式——操作码域。REGW=1(字)W=0(字节)REGW=1(字)W=0(字节)REG寄存器000AXAL100SPAH00ES001BXBL101BPBH01CS010CXCL110SICH10SS011DXDL111DIDH11DS表4-18086寄存器编码表表4-2MOD和R/M的编码各字段的含义如下:

(1)操作码字段OPCODE。

操作码字段规定指令的操作类型,说明指令所要完成的操作。同时还指出操作数类型、操作数传送方向、寄存器编码或符号扩展等。

(2)寻址方式字段。寻址方式字段规定寄存器/存储器操作数的寻址方式。MOD

R/M为主寻址字节,它规定操作数存放的位置(R/M)以及存储器操作数有效地址EA的计算方法。

(3)操作数字段:包括位移量字段DISP和立即数字段DATA。

位移量字段DISP:

位移量是存储器操作数段内偏移地址的一部分。DISP字段指出位移量的大小,其长度为1或2个字节。

立即数字段DATA:

立即数字段指明立即操作数的大小,其长度也是1或2个字节。8位立即数与16操作数一起使用时,CPU自动将它扩展为符号相同的16位数。

(4)前缀字段PREFIX。

前缀字段用于修改指令操作的某些性质。常用前缀有五种:

①段超越前缀:将前缀中指明的段寄存器取代指令中默认的段寄存器。

②操作数宽度前缀:改变当前操作数宽度的默认值。③地址宽度前缀:改变当前地址宽度的默认值。

④重复前缀:重复串的基本操作,以提高CPU处理串数据的速度。

⑤总线锁存前缀:产生锁存信号,以防止其他总线主控设备中断CPU在总线上的传输操作。每个前缀的编码为一个字节。在一条指令前可同时使用多个指令前缀,不同前缀的前后顺序无关紧要。上述指令格式中,操作码字段是必要的,其他字段均可有可无,这取决于特定的操作功能。操作码:指出执行这条指令时,CPU要做什么操作。(OP)一般用指令的一个字节表示,有时由于用8位还不够,常在指令的第二个字节中还可占有3位操作码。指令的第一字节:wd立即方式寻址时,操作码中用S位表示符号扩展

s=1,将8位立即数扩展成16位数时OPd/sww=1,对字进行操作w=0,对字节进行操作d=1,目的操作数d=0,源操作数2、操作数域:操作码域后面所跟的字节一般统称为操作数域。•2字节的有效地址(直接寻址);•1字节或者2字节的位移量;•1字节或者2字节的立即数;•1字节或者2字节的位移量,后面再跟1字节或者2字节的立即数;•2字节的位移量和2字节的段地址(只对段间接转移而言)。指令:单操作数指令双操作数指令8086/8088指令系统是80X86/Pentium的基本指令集。指令的操作数是8位或16位操作数,偏移地址是16位地址。按功能可将指令分成六类,即数据传送类、算术运算类、逻辑运算与移位类、串操作类、控制转移类和处理器控制类。为便于理解指令的形式和功能,对指令中操作数符号的约定如下:OPRD:操作数(operand);OPRD1,OPRD2:多操作数指令中,OPRD1为目标操作数,OPRD2为源操作数;

reg:8位或16位的通用寄存器(register);

sreg:段寄存器(segmentregister);

§4.48086指令系统

reg8:8位通用寄存器;

reg16:16位通用寄存器;

mem:8位或16位存储器(memory);

mem8:8位存储器;

mem16:16位存储器;

imm:8位或16位立即数(immediateoperand

);

imm8:8位立即数;

imm16:16位立即数。§4.48086指令系统§4.48086指令系统数据传送指令算术运算指令逻辑运算指令控制转移指令串操作指令输入/输出指令处理器控制指令中断指令指令前缀§4.4.1数据传送指令通用数据传送指令MOV堆栈操作指令PUSH、POP数据交换指令XCHG查表指令XLAT地址传送指令LEA、LDS、LES标志传送指令LAHF、SAHF、PUSHF、POPF小结通用数据传送指令MOV(Movement)功能:将源操作数内容复制到目操作数中。可使用的操作数类型组合举例:MOVDX,BP ;通用寄存器通用寄存器MOVAX,ES ;通用寄存器段寄存器MOVSP,1800H ;通用寄存器←立即数MOVBL,[2480H] ;通用寄存器存储器MOVDS,[BX+DI] ;段寄存器存储器MOVBYTEPTR[SI],0FH;存储器←立即数CS不能做目操作数!指令格式:MOVOPRD1,OPRD2

指令功能:将源操作数传送给目标操作数,结果目的操作数的内容等于源操作数的内容,源操作数的内容不变。即OPRD2→OPRD1。OPRD1和OPRD2可以是字节或字,但是必须等长。对标志位的影响:无具体指令形式:

MOVreg/sreg,reg

reg/sreg←reg

MOVreg,sreg

reg←sreg

MOVreg/sreg,mem

reg/sreg←mem

MOVmem,reg/sreg

;mem←reg/sreg

MOVreg,imm

reg←imm

MOVmem,imm

;mem←imm

源操作数可以是通用寄存器、段寄存器、存储器以及立即操作数,目标操作数可以是通用寄存器、段寄存器(CS除外)或存储器。各种数据传送关系如下图所示。使用MOV指令进行数据传送时应注意:段寄存器CS及立即数不能作为目标操作数;两个存储单元之间不允许直接传送数据;立即数不能直接传送到段寄存器;两个段寄存器之间不能直接传送数据。说明:(1)双操作数指令不允许两个操作数同时为段寄存器或存储器操作数。

MOVsreg

,sreg

;错误

MOVmem

,mem

;错误

(2)立即数不能传送到段寄存器中。

MOVsreg

,imm

;错误(3)目的操作数不允许使用CS段寄存器。(4)dest与src必须类型匹配,即同时是字节或字类型。以下几点要注意:寄存器具有明确的类型,例如,AL、AX分别为字节、字类型。若立即数没有明确的类型,MASM负责将立即数扩展为与目的操作数位数相同。有时MASM不能确定内存操作数的类型,需要用byteptr和wordptr明确指出是字节或字类型。关于PTR的详细介绍见第5章。只要其中一个操作数的类型确定即可。例:错误的MOV指令如下所示:MOVAX,BL;类型不匹配MOVDS,1000H;不允许立即数送段寄存器MOV[BX],[SI];不允许内存操作数之间传送MOVES,CS;不允许段寄存器之间传送MOVCS,AX;CS不能作为目的操作数例:设B是已定义的字节变量,以下是一些错误和正确的指令。MOVAX,B;错误,类型不匹配MOVAL,0;正确,MASM可以判断出要送字节0堆栈操作指令PUSH/POP

(Pushwordontostack/Popwordoffstack)

堆栈是按照后进先出原则组织的一段内存数据区域。8086规定堆栈设置在堆栈段SS内。堆栈的栈底是固定不变的,这块存储器只有一个出入口,称之为栈顶栈指针SP始终指向堆栈的栈顶。随着PUSH和POP指令的执行,栈顶的位置将发生变化,进栈栈顶向低地址方向扩展,退栈栈顶向高地址(栈底)方向扩展,即SP的内容被修改,并始终指向的是栈顶。在子程序调用或中断时,堆栈用于保护当前的断点地址和现场数据,以便子程序执行完毕后正确返回到主程序。断点地址的保存由子程序调用指令或中断响应来完成,现场数据保存可通过堆栈操作指令来实现。堆栈的概念

堆栈——以“先进后出”原则组织起来的连续的内存空间。堆栈操作以字为单位。固定以SS:SP为指针指示栈顶,出、入堆栈的操作均针对栈顶单元进行。8086的堆栈生长方向为“向下增长”。入栈,指针减出栈,指针加堆栈操作入栈:先修改栈顶指针(SP减1),将入栈数据的高字节存入栈顶;再次修改指针(SP减1),将低字节存入栈顶。出栈:先将栈顶单元的内容存入目标字的低字节中,修改栈顶指针(SP加1);再将当前栈顶单元的内容存入目标字的高字节中,并修改指针(SP加1)。指令格式:PUSHOPRD

POPOPRD

指令功能:进栈指令PUSH使(SP)-2→(SP),然后将16位的源操作数压入堆栈,先高位后低位。源操作数可以是通用寄存器、段寄存器和存储器。

POP退栈指令的执行过程与PUSH相反。它从当前栈顶弹出16位操作数到目标操作数,同时(SP)+2→(SP),使SP指向新的栈顶。目标操作数可以是通用寄存器、段寄存器(CS除外)或存储器。进栈和退栈的操作数要求以字为单位。PUSH和POP指令不影响标志位。堆栈操作指令1、入栈指令PUSH可使用的操作数类型:PUSHCX ;通用寄存器PUSHDS ;段寄存器PUSHWORDPTR[0040H]

;存储器目操作数隐含为栈顶单元指令执行后SP减2入栈过程示意2、出栈指令POP可使用的操作数类型:POPSI ;通用寄存器POPES ;段寄存器POPWORDPTR[BX]

;存储器源操作数隐含为栈顶单元指令执行后SP加2出栈过程示意不能用CS!入栈操作示例设有(SS)=3200H,(SP)=0800H,(AX)=105CH。(SP)=0800H→32800H……StackPUSHAX(SP)=(SP)-1→327FFH(SP)=(SP)-1→327FEH(SP)=07FEH5CHAL10HAH出栈操作示例设有(SS)=3200H,(SP)=07FEH(SP)=(SP)+1→32800HPOPAX(SP)=(SP)+1→327FFH(SP)=07FEH→327FEH……Stack10H5CH(SP)=0800H(AX)=105CHAHAL

具体指令形式:

PUSHreg16;(SP)←(SP)-2,[SP]←reg16

POPreg16;reg16←[SP],(SP)←(SP)+2

PUSHSreg

;(SP)←(SP)-2,[SP]←Sreg16

POPSreg16;Sreg16←[SP],(SP)←(SP)+2

PUSHmem16;(SP)←(SP)-2,[SP]←mem16

POPmem16;mem16←[SP],(SP)←(SP)+2数据交换指令XCHG(Exchange)功能:将源、目操作数的内容互相交换,指令执行后源、目操作数同时被改变。可使用的操作数类型组合:

XCHGCL,DH ;通用寄存器通用寄存器

XCHGAX,[BP] ;通用寄存器存储器立即数为什么不能做操作数?指令格式:XCHGOPRD1,OPRD2

指令功能:将一个字节或一个字的源操作数与目标操作数进行交换。具体指令形式:

XCHGreg,reg

;reg←→reg

XCHGmem,reg

;mem←→reg

XCHGreg,mem

;reg←→mem

XCHG可实现寄存器之间或寄存器与存储器之间的信息交换。但是,不能在两个存储单元之间直接交换数据,段寄存器和立即数不能作为操作数。例:XCHGBX,[BP+SI]如指令执行前:(BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246H)=4254H,OPR2的物理地址=2F000H+0200H+0046H=2F246H则指令执行后:(BX)=4254H,(2F246H)=6F30H。指令格式:XLAT

XLATOPRD;AL←[BX+AL]

指令功能:完成一个字节的查表转换。它将数据段中偏移地址为BX与AL寄存器之和的存储单元的内容送入AL寄存器。在使用该指令时,应首先在数据段中建立一个长度小于256B的表格,表的首地址置于BX中,AL中存放查找对象在表中的下标。指令执行后,所查找的对象存于AL中,BX内容保持不变。查表指令XLAT(Translate)查表指令XLAT(Translate)指令形式XLAT[数据表首地址标号]应用举例TABDB0,1,4,9,16,25,36,49,64,81 ;数据段中以TAB为首地址定义的字节表,数目≤255

……MOVBX,OFFSETTABMOVAL,4XLATTAB指令执行后,(AL)=16。实现什么功能?

1、有效地址传送指令LEA(Loadeffectiveaddress)。

指令格式:LEAOPRD1,OPRD2

指令功能:将源操作数的有效地址送到目的操作数。具体指令形式:

LEAreg16,mem;reg16←Addr(mem)

2、地址指针传送指令LDS(Loaddatesegmentregister)/LES(Loadextra-segmentregister)。

指令格式:LDSOPRD1,OPRD2

指针送寄存器和DS:LDSreg16,mem32;

把源操作数指定的4个相继字节到由指令指定的寄存器及DS寄存器中。该指令常指定SI寄存器。

地址传送指令指令格式:

LESOPRD1,OPRD2指针送寄存器和ES:LESreg16,mem32;

把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中。该指令常指定DI寄存器

。指令功能:这两条指令的功能类似,都是将源操作数偏移地址决定的双字单元中的第一个字的内容传送到指令指定的16位通用寄存器,第二个字的内容传送给段寄存器DS或ES。地址传送指令地址传送指令有效地址传送指令LEA:源操作数的有效地址EA(不是内容!!)→目标寄存器LEA16位通用寄存器,存储器全地址指针传送指令LDS:将源操作数单元的内容当作32位全地址指针,偏移量(低16位)→目标寄存器,段基址(高16位)→DS。LDS16位通用寄存器,存储器全地址指针传送指令LES:将源操作数单元的内容当作32位全地址指针,偏移量(低16位)→目标寄存器,段基址(高16位)→ES。LES16位通用寄存器,存储器应用举例LEA指令与MOV指令的区别:LEASI,BUFF指令是将标号BUFF的偏移地址送入寄存器中;MOVSI,BUFF指令是将标号BUFF所指存储单元的内容送入SI。BUFF=0123454800FEFFLEASI,BUFF;执行后:(SI)=0002HMOVSI,BUFF;执行后:(SI)=0048H段起始地址LDS或LES指令将源操作数指定的4个连续字节单元内容分别送入指令指定的寄存器以及DS或ES中。其中:低16位送到一个指定的字寄存器,高16位送到DS或ES中。57H13H68H24H例:(DS)=C000H,(C2480H)=1357H,(C2482H)=2468HDS:2480HDS:2481HDS:2482HDS:2483H

1357

2468SIDSLDSSI,[2480H]地址传送指令的比较已知:(DS)=09A0H,(BX)=0048HLEADI,[BX]LDSSI,[BX]LESDI,[BX]等价于MOVDI,OFFSET[BX]→执行后:(DI)=0048H→执行后:(SI)=003EH

(DS)=0816H→执行后:(DI)=003EH

(ES)=0816HMemory08H……3EH00H16H09A48H09A49H09A4AH09A4BH标志传送指令标志装入指令LAHF(LoadAHfromflags)(Flags)L→AH标志存储指令SAHF(StoreAHontoflags)AH→(Flags)L标志入栈指令PUSHF(Pushflagsontostack)

将标志寄存器压入堆栈。标志出栈指令POPF

将栈顶字单元的内容弹到标志寄存器中。全部隐含源、目操作数唯一可改变TF的指令!POPF(Popflagsoffstack)

标志字传送指令用于对标志寄存器(PSW)的保护和更新操作。指令的操作数由隐含方式给出。(1)标志字读写指令LAHF/SAHF。

指令格式:LAHF

SAHF

LAHF指令可将标志寄存器的低字节(含符号标志SF、零标志ZF、辅助进位标志AF、奇偶标志PF和进位标志CF)传送到AH寄存器中。这条指令不影响标志位。

SAHF指令的功能与LAHF相反,它将寄存器AH的内容传送到标志寄存器的低字节中。标志传送指令

(2)标志进栈/出栈指令PUSHF/POPF。

指令格式:PUSHF

POPF

PUSHF指令把标志寄存器的内容压入堆栈,同时堆栈指针(SP)←(SP)-2。

POPF指令将堆栈指针SP所指的一个字传送到标志寄存器中,同时堆栈指针(SP)←(SP)+2。说明:LAHF/SAHF指令是寄存器AH与标志寄存器PSW的低字节之间完成的字节型数据传送。

PUSHF/POPF指令是标志寄存器PSW与堆栈间进行的字型数据传送。

指令SAHF/POPF将影响标志位。数据传送指令小结源、目操作数长度必须一致。源、目操作数不能同时是存储器操作数。源、目操作数不能同时是段寄存器。立即数和代码段寄存器CS不能作目的操作数。当目操作数是段寄存器时,源操作数不能是立即数。可以使用段寄存器的指令:MOV、PUSH、POP。除XCHG指令外,其它数传指令仅改变目的操作数,源操作数保持不变。除SAHF、POPF指令外,其它数传指令的执行不影响标志位。对所有指令都适用!§4.4.2算术运算指令加法指令ADD、ADC、INC、AAA、DAA减法指令SUB、SBB、DEC、AAS、DAS、CMP、NEG乘法指令MUL、IMUL、AAM除法指令DIV、IDIV、AAD、CBW、CWD小结

算术运算指令可完成加、减、乘、除运算以及在算术运算过程中进行进制及编码调整操作。在进行这些操作时,可针对字节或字运算,也可对带符号数和无符号数进行运算。

1、加法指令ADD(Addition)。

指令格式:ADDOPRD1,OPRD2

指令功能:将源操作数与目的操作数相加,结果存放于目的操作数。即OPRD1+OPRD2→OPRD1。具体指令形式:

ADDreg,reg

;reg←reg+reg

ADDreg,mem

;reg←reg+mem

ADDreg,imm

;reg←reg+imm

ADDmem,reg

;mem←mem+reg

ADDmem,imm

;mem←mem+imm

要求源操作数和目的操作数同时为带符号的数或无符号数,且长度相等。加法运算指令2、带进位加法指令ADC(Addwithcarry)。

指令格式:ADCOPRD1,OPRD2

指令功能:将源操作数与目的操作数以及进位标志位CF的值相加,并将结果存放于目的操作数,即OPRD1+OPRD2+CF→OPRD1。

具体指令形式:

ADCreg,reg

;reg←reg+reg+CF

ADCreg,mem

;reg←reg+mem+CF

ADCreg,imm

;reg←reg+imm+CF

ADCmem,reg

;mem←mem+reg+CF

ADCmem,imm

;mem←mem+imm+CF

加法运算指令

3、加1指令INC(Incrementdestinationby1)。

指令格式:INCOPRD

指令功能:将指定操作数内容加1。INC指令不影响进位标志CF。

具体指令形式:

INCmem

;mem←mem+1

INCreg

;reg←reg+1

加法运算指令加法运算指令1、加指令ADD形式:ADD目的操作数,源操作数功能:目操作数内容+源操作数内容→目的操作数;执行之后影响所有状态标志SF、ZF、AF、PF、CF、OF

。允许的操作数类型:目的操作数——通用寄存器、存储器;源操作数——通用寄存器、存储器、立即数。2、带进位的加指令ADC功能:目操作数内容+源操作数内容+CF→目操作数其余与ADD指令相同!3、自加1指令INC形式:INC操作数(通用寄存器或存储器)功能:操作数内容+1→操作数;执行之后影响标志位SF、ZF、AF、PF、OF

,但不影响CF

!最常用的加法用于高字(字节)相加常用于修改地址指针

1、减法指令SUB(Subtract)。

指令格式:SUBOPRD1,OPRD2

指令功能:将目的操作数减去源操作数,结果存放于目的操作数,即OPRD1-OPRD2→OPRD1。

具体指令形式:

SUBreg,reg

;reg←reg-reg

SUBreg,mem

;reg←reg-mem

SUBreg,imm

;reg←reg-imm

SUBmem,reg

;mem←mem-reg

SUBmem,imm

;mem←mem-imm

减法运算指令

2、带借位减法指令SBB(Subtractwithborrow)。

指令格式:SBBOPRD1,OPRD2

指令功能:将目的操作数减去源操作数,再减去借位CF的值,结果存放于目的操作数。即OPRD1-OPRD2-CF→OPRD1。

具体指令形式:

SBBreg,reg

;reg←reg-reg-CF

SBBreg,mem

;reg←reg-mem-CF

SBBreg,imm

;reg←reg-imm-CF

SBBmem,reg

;mem←mem-reg-CF

SBBmem,imm

;mem←mem-imm-CF

减法运算指令3、减1指令DEC(Decrementdestinationby1)。

指令格式:DECOPRD

指令功能:对指定操作数减1。DEC指令不影响进位标志。具体指令形式:

DECmem

;mem←mem-1

DECreg

;reg←reg-1

减法运算指令减法运算指令1、减指令SUB形式:SUB目操作数,源操作数功能:目操作数内容-源操作数内容→目操作数;执行之后影响所有状态标志SF、ZF、AF、PF、CF、OF

。允许的操作数类型:目操作数——通用寄存器、存储器;源操作数——通用寄存器、存储器、立即数。2、带借位的减指令SBB功能:目操作数内容-源操作数内容-CF→目操作数其余与SUB指令相同!3、自减1指令DEC形式:DEC操作数(通用寄存器或存储器)功能:操作数内容-1→操作数;执行之后影响标志位SF、ZF、AF、PF、OF,但不影响CF

!最常用的减法用于高字(字节)相减常用于修改地址指针指令格式:CMPOPRD1,OPRD2指令功能:将目的操作数减去源操作数,结果不予保存。只是根据结果的状态设置条件标志位,设置状态标志位与SUB指令含义相同。

CMPreg,reg

reg-reg

CMPreg,mem

reg-mem

CMPreg,imm

;reg-imm

CMPmem,reg

;mem-reg

CMPmem,imm

;mem-imm

比较指令CMP(Comparetwooperands)比较指令通常用于比较两个操作数的大小。由受影响的标志位状态来判断两个操作数比较的结果。不论是无符号数比较还是有符号数比较,若在比较指令后,(ZF)=1,则两者相等,否则不相等。若两者不相等,则可在比较两个数之后,利用其他标志位的状态来确定两者中哪个大。比较指令CMP

如果是两个无符号数比较,则可根据进位标志CF的状态来判断:若(CF)=1,则OPRD1<OPRD2;若(CF)=0,则OPRD1>OPRD2。

如果是两个有符号数比较,则要根据SF和OF两个标志的关系来判断:若SF⊕OF=0,则OPRD1>OPRD2;若SF⊕OF=1,则OPRD1<OPRD2。

在程序中,比较指令常用于条件转移之前,条件转移指令根据CMP操作之后的状态标志决定程序转移或不转移。比较指令CMP比较指令CMP使用方法与SUB、SBB相同。功能:目操作数-源操作数,同时影响状态标志SF、ZF、AF、PF、CF、OF

。CMP通常用于比较两个数,其后一般紧跟着条件转移指令以实现不同情况下的分支处理。例:

CMPAL,BL;AL-BL,保持寄存器的值不变

JNZEQUAL;若(ZF)=0(不等),转EQUAL处

……

;(ZF)=1(相等)情况下的处理不改变操作数本身的值!指令格式:NEGOPRD

指令功能:对指定操作数求补运算。在机器内部,对操作数的求补操作是对操作数进行求反后末位加1。通过求补可使正数变为负数或使负数变为正数。这样使得一个正数减去一个正数的减法运算,转化为一个正数加上一个负数的加法运算。具体指令形式:

NEGmem

;mem←0-mem

NEGreg

;reg←0-reg取相反数指令NEG

(Negateorform2,scomplement)取相反数指令NEG形式:NEG操作数功能:0-操作数内容→操作数;影响所有状态标志SF、ZF、AF、PF、CF、OF

允许的操作数类型:通用寄存器、存储器实质上,NEG指令相当于将目操作数固定为0值的SUB指令;执行结果即取原数的相反数。乘法指令包括无符号数乘法、带符号数乘法两种。

1、无符号数乘法指令MUL(Multiplyaccumulatorbyregister-or-memory;unsigned)。

指令格式:MULOPRD

指令功能:完成两个无符号数的乘法运算。要求被乘数放在AL或AX累加器中,用于字节运算和字运算,另一乘数可通过指令中的OPRD(除立即数方式以外的寻址方式)获得。具体指令形式:

MULreg

;(AX)←(AL)×reg8乘法运算指令或(DX,AX)←(AX)×reg16

2、带符号数乘法IMULOPRD;操作同上

IMUL(Integermultiplyaccumulatorbyregister-or-memory;signed)

进行字节运算时,目的操作数必须是累加器AL,乘积在寄存器AX中;进行字运算时,目的操作数必须是累加器AX,乘积在寄存器DX,AX中。源操作数不允许使用立即数。

乘法指令运算结果只影响状态标志CF、OF。

例:MULBX;无符号数乘法,BX乘上AX乘法运算指令

具体指令形式:

IMULreg

;(AX)←(AL)×reg8

或(DX,AX)←(AX)×reg16

IMULmem

;(AX)←(AL)×mem8

或(DX,AX)←(AX)×mem16

乘法指令的执行结果会使标志位发生变化。只有进位标志CF、溢出标志OF有意义,其它标志位无定义。CF、OF定义如下:当进行字节运算时,其结果超过字节长度成为字((AH)≠0),CF和OF置“1”;乘法运算指令

当进行字运算时,其结果超过字长度成为双字((DX)≠0),CF和OF置“1”。这样就可以用OF及CF来检查和判断字节或字操作的结果。对MUL指令,当进行字节操作时,乘积结果的高一半为0((AH)=0),或当进行字操作时,乘积结果高一半为0((DX)=0),CF和OF均为0。对于IMUL指令,如果乘积结果的高一半为低一半的符号位的扩展,那么CF和OF均置“0”,否则置“1”。

乘法指令为乘积保留了两倍于原来操作数的存储空间,因而不会出现溢出现象。

乘法运算指令乘法运算指令无符号数乘法指令:MUL通用寄存器或存储器带符号数乘法指令:IMUL通用寄存器或存储器乘积低字节→AL乘积高字节→AH乘积低位字→AX乘积高位字→DX影响标志CF、OF

:相乘后若高位(AH或DX)≠0,则将CF、OF置1,否则清0。字节相乘:AL值×操作数内容(8位)→字相乘:AX值×操作数内容(16位)→

除法指令包括无符号数除法指令DIV,带符号数除法指令IDIV,以及在除法运算中辅助DIV、IDIV指令的字节转换为字指令CBW和字转换为双字指令CWB。

1、无符号数除法指令DIV(Division;unsigned)。

指令格式:DIVOPRD

指令功能:完成两个无符号数的除法运算,除法操作可作字节或字操作。在进行字节操作时,要求被除数为16位、并存放在AX累加器,除数8位由指令中的源操作数指定,结果的8位商存放于AL中,8位余数存放于AH中。在进行字操作时,要求被除数为32位,存放在DX,AX寄存器中,16位除数由指令中源操作数指定,结果的16位商存放于AX中,16位余数存放于DX中。除法运算指令

2、带符号数除法指令IDIV(Integerdivision;signed)。指令格式:IDIV源操作数指令功能:完成两个带符号数的除法操作。在执行该指令时,要求操作数为带符号数,商及余数也为带符号数,余数与被除数的符号相同。除法指令的使用需要说明:

①源操作数不允许使用立即寻址方式。

②除法指令执行后,标志位无定义。

③除数为零时,则产生一个0类型中断。在除法运算中常常使用CBW和CWD对除法所需操作数进行长度扩展。除法运算指令除法运算指令

无符号数除法指令:DIV通用寄存器或存储器带符号数除法指令:IDIV通用寄存器或存储器商→AL余数→AH商→AX余数→DX字节除法:AX值÷操作数内容(8位)→字除法:DX:AX值÷操作数内容(16位)→IDIV之后,余数与被除数同号。除数太小致使商超过规定的长度时,自动转入中断处理。不影响任何标志!

十进制调整指令

在算术运算中操作数可以采用BCD码,但是运算后的结果必须经过调整,否则结果是错误的。BCD码是一种用二进制编码表示的十进制数,每个BCD码都是由4位二进制代码来表示的,故称为压缩BCD码。例如,10000101可看作十进制的85。使用BCD码进行算术运算,一方面符合计算机只能处理二进制数的要求,另一方面BCD码也给编写和阅读程序带来了直观效果。为此指令系统提供了必须用在ADD、ADC指令后面的加法十进制调整指令DAA和必须用在SUB、SBB指令后面的减法十进制调整指令DAS。经过调整后的结果才是正确的BCD码。

1、非压缩BCD数加法调整指令AAA(ASCIIadjustforaddition)。

指令格式:AAA

指令功能:将寄存器AL中的和调整为非压缩的BCD码。AAA指令用在ADD、ADC指令之后。

AAA指令调整过程如下:

①当(AL)的低4位为0~9H之间,且AF为“0”,则执行③;

②当(AL)

温馨提示

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

评论

0/150

提交评论