微机原理接口技术03-指令系统_第1页
微机原理接口技术03-指令系统_第2页
微机原理接口技术03-指令系统_第3页
微机原理接口技术03-指令系统_第4页
微机原理接口技术03-指令系统_第5页
已阅读5页,还剩145页未读 继续免费阅读

下载本文档

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

文档简介

指令是计算机用以控制各个部件协调工作的命令,指令系统是微处理器所能执行的指令的集合,它与微处理器有密切的联系,不同的微处理器有不同的指令系统第3章指令系统3.18086指令系统概述计算机的工作就是运行程序,而程序由存储在存储器中的指令序列构成。

微处理器高效软件的发展要求对每条指令的寻址方式(AddressingMode)都要相当地熟悉。机器语言指令由二进制代码组成。指令语句一般由操作码(OperatingCode)和操作数(OperatingData)两部分组成:

汇编语言助记符指令书写的基本格式为

(标号):操作码

(操作数)(;注释)

其中,操作码是指令语句中不可缺少的;带括号的项是可选项,如果有此项时,不能加括号;多个操作数间是以‘,’隔开的;操作码与操作数之间必须以空格分开。助记符指令格式

操作码由便于记忆的助记符表示(通常为英文单词缩写),操作码表示计算机执行什么操作;操作数可能指明了参与操作的数本身,或规定了操作数的地址。

8086/8088系统中一条指令的操作数可以是双操作数(源操作数和目的操作数),也可以是单操作数,有的指令还可以没有操作数或隐含操作数。而80386/80486系统中的指令则有多个操作数操作数主要分为三类:立即数操作数立即数即常数,是一个固定数值的操作数;寄存器操作数寄存器操作数存放在CPU的某个寄存器中;存储器操作数存储器操作数则存放在内存的数据区中。3.2寻址方式

通过指令采用合适的方式指定操作数的地址。寻找操作数所在地址的方法称为寻址方式。

在80X86系统中,寻址方式通常分为两种:一种为寻找操作数的地址,称为数据寻址;另一种为寻找要执行的下一条指令的地址,即程序转移或子程序调用时的目的地址或入口地址,称为程序转移地址寻址。

3.2.1数据的寻址方式

本节中寻址方式一般针对源操作数而言,以通用传送指令为例

MOVDST,SRC

SRC为源操作数,指令执行过程中原值保持不变;DST为目的操作数,原值不保留,MOV指令完成从源操作数向目的操作数拷贝数据的功能。3.2.1数据的寻址方式1.立即寻址(ImmediateAddressing)

操作数包含在指令码中,由指令给出。汇编语言可用多种方式描述立即数。立即操作数可以是常数,如果操作数以字母开头,汇编程序要求操作数在其前加0。

立即寻址通常用于给寄存器赋值,并且只适用于源操作数字段,不能用于目的操作数字段,要求源操作数与目的操作数长度一致。MOVAL,100

指令执行后,

(AL)=64H

MOVCL,01001100B

指令执行后,

(CL)=4CH

MOVAX,1234H

指令执行后,

(AX)=1234H3.2.1数据的寻址方式立即数如果是多字节数,则高位字节存放在高地址中,低位字节存放在低地址中。

3.2.1数据的寻址方式3.2.1数据的寻址方式3.2.1数据的寻址方式2.寄存器寻址(RegisterAddressing)

寄存器寻址是一种最普遍的数据寻址方式,指令指定寄存器号,操作数存放在指令规定的CPU内部寄存器中。可用于寄存器寻址的为通用寄存器。寄存器寻址不需要访问存储器,也不需要使用总线周期,操作在CPU内部进行,因而可取得较高的运算速度。MOVAX,BX

指令执行前,(AX) = 5678H,(BX) = 1234H;指令执行后,(AX) = 1234H,(BX) = 1234H。

除上述两种寻址方式外,以下各种寻址方式的操作数均在代码段以外的存储区中,寻址方式通过不同的途径求得操作数的偏移地址,即有效地址EA(EffectiveAddress)。3.2.1数据的寻址方式3.2.1数据的寻址方式3.直接寻址(DirectAddressing)

直接寻址由指令直接给出操作数的有效地址EA,操作数本身在存储单元中,通常存放在数据段,默认的段寄存器为DS。操作数有效地址格式为

[数值]或符号或[符号]

MOVAX,[2040H]

执行结果为(AX) = 6A4BH

注意:本指令不是将立即数2040H传送到AX,而是将有效地址是2040H的存储单元的内容传送到AX。

3.2.1数据的寻址方式汇编语言指令中可以用符号地址代替数值地址:

MOVAX,[TABLE];或MOVAX,TABLE;这两者等价,此处TABLE为存放操作数单元的符号地址。

如果要对其他段寄存器所指出的存储区进行直接寻址,则在指令前必须用前缀指出段寄存器名。

MOVAX,ES:[2000H];将ES段的2000H和2001H两单元的内容传送到AX。

3.2.1数据的寻址方式3.2.1数据的寻址方式

4.寄存器间接寻址(RegisterIndirectAddressing)

操作数的有效地址存放在基址寄存器或变址寄存器中,而操作数则在存储器中。对16位数进行寄存器间接寻址时可用的寄存器是基址寄存器BX、BP和变址寄存器SI、DI。使用BP时默认的段寄存器为SS,使用其他寄存器默认的段寄存器为DS。

操作数有效地址格式为:[间接寻址的寄存器]。寻址寄存器放在方括号中。MOVBX,[BP]

指令执行前,(BP) = 4000H,执行结果为:(BX) = 50A0H。3.2.1数据的寻址方式3.2.1数据的寻址方式寄存器间接寻址方式可用于表格处理,执行完一条指令后,只需修改寄存器的内容就可以取出表格中的下一项。3.2.1数据的寻址方式5.寄存器相对寻址(RegisterRelativeAddressing)

操作数的有效地址为指令中规定的间接寻址寄存器的内容和指令中指定的位移量之和。操作数存放在存储器中。操作数有效地址格式为

位移量[间接寻址的寄存器]或[位移量 + 间接寻址的寄存器]

MOVAX,TAB[SI]

如果TAB为16位的符号地址,其值为3080H,(SI)= 2000H,默认的段寄存器为DS,则

EA=TAB+(SI)=3080H+2000H=5080H

3.2.1数据的寻址方式

寄存器相对寻址可用于表格处理或访问一维数组中的元素。把表格的首地址设置为位移量,利用修改间接寄存器的值来存取表格中的任意一个元素。3.2.1数据的寻址方式3.2.1数据的寻址方式6.基址变址寻址(BasedIndexedAddressing)

操作数的有效地址是一个基址寄存器和变址寄存器的内容之和,操作数本身在存储单元中。操作数有效地址格式为:

[基址寄存器][变址寄存器]

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。3.2.1数据的寻址方式

基址变址寻址同样适用于数组或表格处理,首地址存放在基址寄存器中,变址寄存器访问数组中各元素。因两个寄存器都可以修改,所以它比寄存器相对寻址方式更灵活。需要注意的是,两个寄存器不能均为基址寄存器,也不能均为变址寄存器。3.2.1数据的寻址方式7.基址变址相对寻址

(RelativeBasedIndexedAddressing)

操作数的有效地址为指令中规定的1个基址寄存器和1个变址寄存器的内容及指令中指定的位移量三者之和。位移量[基址寄存器][变址寄存器]可以表示成多种形式组合。寻址寄存器要放在方括号中。3.2.1数据的寻址方式MOVAX,TAB[BX][SI]

(BX) = 1000H,(SI) = 2000H,

TAB = 0150H

EA = (BX) + (SI) +TAB = 3150H

执行结果(AX) = 1234H。3.2.1数据的寻址方式3.2.1数据的寻址方式基址变址相对寻址通常用于对二维数组的访问。位移量为数组起始地址。基址寄存器和变址寄存器分别存放行和列的值,利用相对基址变址寻址就可以直接访问二维数组中指定的某个元素。

3.2.1数据的寻址方式8.隐含寻址(ConcealedAddressing)

有些指令的指令码中不包含指明操作数地址的部分,而其操作码本身隐含地指明了操作数的地址。如:LODSB;表示SI的内容送到AL,SI指针加1。该指令将在后面串操作指令部分详细介绍。

3.2.1数据的寻址方式

9.I/O端口寻址

I/O端口寻址就是寻找输入输出设备的端口地址对I/O端口的寻址有以下两种方式。

(1)直接端口寻址方式端口地址用8位地址码表示:

IN AL(AXorEAX),port8;

OUTport8,AL(AXorEAX)

如:INAL,21H。表示从I/O地址为21H的端口中读取数据到AL中。3.2.1数据的寻址方式

(2)间接端口寻址方式

端口地址为16位,并规定存放在寄存器DX中。格式如下:

INAL(AXorEAX),DX;

OUTDX,AL(AXorEAX)

如:INAL,DX。这条指令表示从DX寄存器内容所指定的端口中读取数据到AL中。3.2.1数据的寻址方式3.2.2程序转移地址寻址方式

CPU执行指令时,指令是按顺序存放在存储器中的,而程序执行顺序是由CS和IP的内容来决定的。当程序执行到某一转移或调用指令时,需脱离程序的正常顺序执行,而把它转移到指定的指令地址,程序转移及调用指令通过改变IP和CS内容,就可改变程序执行顺序。

根据程序转移地址相对于当前程序地址的关系,可分为段内、段外;又根据转移地址是否直接出现在指令中,分为直接、间接,所以有四种程序转移寻址方式:段内直接寻址、段内间接寻址、段间直接寻址及段间间接寻址。3.2.2程序转移地址寻址方式1.段内直接寻址(IntrasegmentDirectAddressing)

段内直接寻址方式也称为相对寻址方式。指令码中包括一个位移量disp,转移的有效地址为:

EA = (IP) + disp。当位移量是8位时,称为短程转移;当位移量是16位时,称为近程转移。

JMPNEARPTR符号地址

JMPSHORT符号地址3.2.2程序转移地址寻址方式2.段内间接寻址(IntrasegmentIndirectAddressing)

程序转移的有效地址是一个寄存器或存储单元的内容。所得到的转向的有效地址用来取代IP寄存器的内容。

JMP寄存器

JMP存储单元

由于以上两种寻址方式仅修改IP的内容, 所以这种寻址方式只能在段内进行程序转移。3.2.2程序转移地址寻址方式JMPBX

如果(BX) = 1020H,则指令执行后

(IP) = 1020HJMPTABLE[BX][SI]

如果(DS) =

2000H,(BX) = 1020H,

(SI) = 0002H,TABLE = 0010H,(21032H) = 1234H,

则指令执行后

(IP)=((DS)×10H+(BX)+(SI)+TABLE)

=(2000H×10H+1020H+0002H+0010H)=(21032H)=1234H

3.2.2程序转移地址寻址方式3.段间直接寻址(IntersegmentDirectAddressing)

指令中直接给出程序转移的代码段地址和偏移地址来取代当前的CS和IP。

指令的汇编语言格式为

JMPFARPTR符号地址;FARPTR表示段间转移的操作符3.2.2程序转移地址寻址方式4.段间间接寻址(IntersegmentIndirectAddressing)

程序转移的有效地址是一个存储单元中连续4个字节的内容。这个存储单元的内容可以用数据寻址方式中除立即数和寄存器方式以外的任何一种寻址方式获得,将所寻址的存储单元前2个字节内容送IP,后2个字节内容送CS。指令的汇编语言格式为

JMPDWORDPTR存储单元3.2.2程序转移地址寻址方式JMPDWORDPTR[BX]

如果(BX) = 1034H,且从1034H开始的连续4个存储单元内容分别为12H、34H、56H、78H,则指令执行后(IP)=1234H,(CS)=5678H。

3.2.2程序转移地址寻址方式3.38086指令系统指令系统是指微处理器所能执行全部指令的集合。不同微处理器具有不同的指令系统,这在微处理器设计时就已决定了。80X86系列的CPU中,其指令系统的机器代码是完全向上兼容的。80X86指令系统按功能可分为以下9类:

(1)数据传送类指令;

(2)算术运算类指令;

(3)逻辑运算和移位类指令;

(4)位操作指令;

(5)串操作指令;

(6)控制转移类指令;

(7)处理器控制指令;

(8)高级语言类指令;

(9)操作系统型指令。3.38086指令系统常用到的一些符号所表示的含义。src

源操作数dst

目的操作数data

立即数disp

8位或16位位移量[]

存储单元的内容mem

存储器操作数opr

表示操作数reg

寄存器count

移位次数,可以是1或CL3.38086指令系统3.3.1数据传送类指令数据传送类指令用于实现立即数到寄存器或存储器、CPU内部寄存器之间、寄存器与存储器之间、累加器与I/O口之间的数据传送。除标志位传送指令之外,数据传送类指令不会影响标志寄存器中的标志位。这类指令又分为通用数据传送、地址传送、标志传送和输入输出等4组指令。1.通用数据传送指令

通用数据传送指令包括最基本的传送指令、堆栈指令、数据交换指令、换码指令。(1)数据传送指令

基本的传送指令包括MOV、MOVSX、MOVZX。其中MOVSX、MOVZX仅在386及其后继机型中可用。3.3.1数据传送类指令

●传送指令(move)——MOV

指令格式:MOVDST,SRC

指令功能:将源操作数SRC的内容传送到目的操作数DST所指单元,完成字节、字或双字传送。源操作数可以是通用寄存器(REGn)、段寄存器(SEG)、立即数(DATAn)和存储单元(MEMn)。目的操作数可以是REGn、SEG和MEMn。存储单元可通过数据寻址的各种寻址方式寻址。3.3.1数据传送类指令在使用MOV指令时应注意以下几点:

(1)目的操作数不得为立即数。如:MOV12H,BL为非法指令。

(2)不影响标志位。

(3)操作数类型必须一致。如:MOVAX,BL为非法指令,应为MOVAL,BL。

(4)源操作数为非立即数时,两操作数之一必为寄存器。如:MOV[DX],[SI]为非法指令,不能在两个存储单元之间进行数据传送。

3.3.1数据传送类指令

(5)目的操作数为段寄存器(CS和IP或EIP不能作为目的寄存器),源操作数不得为立即数。

(6)不能在段寄存器之间进行直接数据传送。如:MOVDS,ES为非法指令。3.3.1数据传送类指令几个不能传送操作的解决办法是通过AX作桥梁。

存储器←存储器:

MOVAX,MEM1

MOVMEM2,AX

段寄存器←段寄存器:

MOVAX,SEG1

MOVSEG2,AX

段寄存器←立即数:

MOVAX,DATA

MOVSEG,AX3.3.1数据传送类指令(2)堆栈操作指令

堆栈指令包括压栈PUSH和出栈POP指令。堆栈是按“后进先出(LIFO)”方式工作的存储区域。规定由SS指示堆栈段的段基址,堆栈指针(E)SP始终指向堆栈的顶部,(E)SP的初值规定了所用堆栈区的大小。堆栈的最高地址叫栈底。进栈方向是由高地址向低地址发展。3.3.1数据传送类指令①压入堆栈指令指令格式:PUSHsrc指令功能:SP←SP-2,((SP)+1,(SP))←(src)。指令中的操作数可以是通用寄存器、段寄存器、存储器,但不能是立即数。例如:

PUSHAX;SP←SP-2,(SP)+1←(AH),

(SP)←(AL)3.3.1数据传送类指令②弹出堆栈指令指令格式:POPdst指令功能:dst←((SP)+1,(SP)),SP←(SP)+2。操作数可以是通用寄存器、存储器、段寄存器(但不能是CS),同样,不能是立即数。

POPBX;BH←((SP)+1),BL←((SP)),

SP←(SP)+2

注意,堆栈指令中操作数一定是16位操作数。3.3.1数据传送类指令【例】PUSHAX

如果(AX) = 1234H,(SP) = 0100H,则指令执行后,(SP) = 00FEH。3.3.1数据传送类指令【例】POPAX

3.3.1数据传送类指令【例】如果将AX,BX两个寄存器的内容互换,则可执行下列程序段实现。

PUSH AX

PUSH BX

POPAX

POP BX

3.3.1数据传送类指令(3)数据交换指令

指令格式:XCHGDST,SRC

指令功能:将两个操作数的内容相互交换。两操作数之一必为寄存器,操作数不能为立即数。两个操作数可以同时为寄存器,但不允许同时都为段寄存器。该指令执行后不影响标志位。例如:

XCHGAH,BL

XCHGES,AX

XCHGEAX,ARRAY[4*EBX]3.3.1数据传送类指令(4)

换码指令

指令格式:XLAT

指令功能:用查表方式将一种代码转换成另一种代码。如将字符的扫描码转换为ASCII码。该类指令是隐含寻址。规定BX指向存放在内存表格的首地址,AL为表格中某一元素与表格首地址之间的偏移量,表格中的内容即为要替换的代码,指令执行后在AL中得到转换后的代码。3.3.1数据传送类指令

例3-1有一个表存放数字0~9的ASCII码,其表首地址是0100H,找出7的ASCII码。

MOVBX,0100H;0100→BXMOVAL,7;7→ALXLAT;[BX+AL]→AL3.3.1数据传送类指令2.地址传送指令

1)有效地址传送指令——LEA(loadeffectiveaddress)

指令格式:LEAREG,SRC ;(REG)←SRC

指令功能:将源操作数的有效地址EA传送到指定寄存器中。源操作数的寻址方式只能是存储器寻址方式(即不允许是立即数和寄存器寻址方式),目的操作数的寄存器可使用16位或32位寄存器,但不能为段寄存器。3.3.1数据传送类指令【例】比较以下两条指令的执行结果。

LEABX,[DI]

MOV BX,[DI]

3.3.1数据传送类指令2)指针传送指令LDS(loadDSwithpointer)

指令格式:LDSREG,MEM

;(REG)←(MEM),(DS)←(MEM+2)

指令功能: 将源操作数MEM所指定存储单元中连续4个单元的前两个单元的内容作为有效地址存入指令指定的16位寄存器(REG)中,后两个单元的内容装入指令指定的段寄存器(DS)中.

3.3.1数据传送类指令

【例】LDSBX,TABLE[SI]

如果指令执行前,TABLE = 0200H,(SI) = 0008H,(DS) = 0000H,则EA= TABLE + (SI) =0200H + 0008H = 0208H。指令执行后,(DS) = 1000H,(BX) = 1234H3.3.1数据传送类指令

3)地址指针装入ES指令指令格式:LESreg,mere

指令功能:与LDS指令功能类似,只是把DS换成ES。操作时将段地址传送到ES段寄存器。需要注意的是,LDS、LES两条指令都是传送一个目的地址指针,包括一个偏移地址和一个段地址,共32位数据。3.3.1数据传送类指令3.标志传送指令

1) 标志送AH(loadAHwithflags)——LAHF

指令格式:LAHF ;(AH)←(FLAGS的低字节)

指令功能:将标志寄存器FLAGS的低8位中5个状态标志位(不包括OF)分别传送到AH的对应位,如图所示。该指令的执行不影响标志位。2) AH送标志寄存器(storeAHintoflags)SAHF

指令格式:SAHF

;(FLAGS的低字节)←(AH)

指令功能:SAHF指令与LAHF指令 功能相反,即将AH中相应位(D7、D6、D4、D2、D0)的状态分别传送到标志寄存器FLAGS的对应位(SF、ZF、AF、PF、CF),而FLAGS其他位不受影响。3.3.1数据传送类指令3)标志进出栈指令

PUSHF(pushtheflags);

POPF(poptheflags)

指令功能:将FLAGS标志寄存器中内容压入堆栈/从堆栈中弹出字FLAGS标志寄存器中。3.3.1数据传送类指令3.3.2算术运算类指令

80X86提供了加、减、乘、除等各类算术运算指令,这些指令可处理4种类型的数据:有符号的二进制数、无符号的二进制数、无符号的压缩十进制数(压缩BCD码)和无符号非压缩十进制数(非压缩BCD码)。压缩型BCD码一个字节表示两位BCD码。非压缩型BCD码一个字节表示一位BCD码,有效位在低4位,高4位为零

1.加减法指令

不带进(借)位的加减法指令ADD、SUB;带进(借)位的加减法指令ADC、SUB;增减量指令INC、DEC;特殊减法指令即求补指令NEG、比较指令CMP。3.3.2算术运算类指令1) ADD/SUB——加/减法指令

(addition/subtraction)

指令格式:ADDDST,SRC ;

SUBDST,SRC

指令功能:ADD指令将目的操作数与源操作数相加之和送到目的操作数所指单元中。SUB指令将目的操作数与源操作数相减之差送到目的操作数所指单元中。指令会影响SF、ZF、CF、AF、PF和OF等6个标志位。3.3.2算术运算类指令

指令中源操作数可以是通用寄存器REGn、立即数DATAn和存储单元MEMn。目的操作数可以是REGn和MEMn。源操作数和目的操作数都不能是段寄存器,目的操作数不得为立即数。存储单元可通过数据寻址的各种寻址方式寻址。使用加、减法指令时,应注意源操作数为非立即数时,两操作数之一必为寄存器,两存储单元之间不能进行加、减法运算。两操作数类型必须一致,可以同时为字节、字或双字。3.3.2算术运算类指令例如:

ADDAX,DI ;(AX)←(AX) + (DI)

SUBBL,5FH ;(BL)←(BL) - (5FH)

下边3条指令是非法的

ADDDS,BX ;操作数不允许为段寄存器

SUB[DI],[BP]

;不允许两操作数都为存储单元

ADD34H,EAX ;目的操作数不能为立即数3.3.2算术运算类指令2) ADC/SBB——带进/借位加/减法指令(additionwithcarry/subtractionwithcarry)

指令格式:ADCDST,SRC ;

SBBDST,SRC

指令功能:将进/借位标志位的值(CF)一起与操作数相加/减。该组指令主要针对出现在8086中超过16位的数据进行多字节加/减法的运算中,其中CF的当前值是由程序中本指令之前的指令产生的。其他规定均与ADD/SUB指令相同。3.3.2算术运算类指令

3) INC/DEC——增减量指令

(increment/decrement)

指令格式:INC DST ;DECDST

指令功能:INC/DEC将目的操作数的内容加/减1。用于循环程序中指针修改。该组指令影响OF、SF、ZF、AF、DF标志位,但不影响CF位。目的操作数可以是REGn和MEMn。目的操作数不能是段寄存器,不得为立即数。3.3.2算术运算类指令4)求补指令(negate)——NEG

指令格式:NEG DST

指令功能:对一个操作数取补码,即相当于用0减去目的操作数,并将结果送回到目的操作数。可利用NEG指令得到补码表示的负数的绝对值。

3.3.2算术运算类指令

5)比较指令(compare)——CMP

指令格式:CMP DST ,SRC

指令功能:将两个操作数相减,但不将结果送回到目的操作数,两个操作数的内容均不变,仅根据结果影响标志位,CMP指令对标志位的影响与SUB相同。目标操作数可以是寄存器或存储器,源操作数可以是立即数、寄存器或存储器,既可以进行字节比较,也可以进行字比较。一般情况下,该指令后面都会有一条条件转移指令,用来检查标志位的状态是否满足某种关系。3.3.2算术运算类指令

比较指令后面常常会跟一个跳转指令,以检测标志位,控制程序的走向。CMP指令执行后可根据标志位判断比较结果。

(1)根据ZF判断两个数是否相等。若ZF = 1,则两数相等。

(2)若两个数不相等,则分两种情况考虑:

①比较的是两个无符号数:

若CF = 0,则(DST)≥(SRC);

若CF = 1,则(DST)<(SRC)。

②比较的是两个有符号数:

若OF⊕SF = 0,则(DST)>(SRC);

若OF⊕SF = 1,则(DST)<(SRC)。3.3.2算术运算类指令2.乘法指令

乘法指令有单操作数的无符号数乘法指令MUL和有符号数乘法指令IMUL指令。386及其后继机型中还增加了双操作数和三操作数有符号数乘法指令IMUL指令。3.3.2算术运算类指令1)无符号数乘法指令(multiple)——MUL

指令格式:MULSRC

指令功能:将目的操作数乘以源操作数,结果存放到目的操作数中。目的操作数是隐含寻址,必须为累加器。源操作数用于存放乘数,可以是寄存器或存储器中的数据,但不允许为立即数。乘法指令执行完后的结果总是一个两倍于原数据大小的数据。当两个8位数相乘时,16位乘积存放在AX中;当两个16位数相乘时,32位乘积存放在DX:AX中,其中高位字存放在DX中,低位字存放在AX中。3.3.2算术运算类指令

当乘法指令执行完后,一些标志位(CF和OF)会改变,产生预期的结果。其他的标志位也会改变,不过它们的结果是无法预知的,因而不能被利用。CF、OF表示乘积值的范围。对于无符号数,若CF = OF = 0,则表示AH(字节乘)/DX(字乘)乘积值高位为零。3.3.2算术运算类指令

2)有符号数乘法指令(signedmultiple)——IMUL

指令格式:IMULSRC

指令功能:与MUL相同,只是必须是有符号数。对于有符号数,IMUL执行后,CF = OF = 0,AH(字节乘)/DX(字乘)乘积值高位为符号扩展。若CF = OF = 1,则积的高位存在其有效值。3.3.2算术运算类指令3.除法指令

除法指令有无符号数除法指令DIV和有符号数除法指令IDIV。和乘法一样,除法指令的操作数类型可以是字节或字者。被除数的字长常常是两倍于除数字长的数据。可以用符号扩展的方法获得除法指令所需要的被除数格式。对于除法来讲,全部标志无意义。溢出处理不是使OF为1,而是当除数为0时产生0号中断。3.3.2算术运算类指令1)无符号数除法指令(divide)——DIV

指令格式:DIVSRC

指令功能:完成两个不带符号的8位/16位二进制数的除法运算。将AX(16位)中或DX和AX(32位)中的内容,除以在指定的寄存器或存储单元中的内容,对于字节除法,所得的商存于AL,余数存于AH;对于字除法,所得的商存于AX,余数存于DX。3.3.2算术运算类指令2)有符号数除法指令(signeddivide)——IDIV

指令格式:IDIVSRC

指令功能:有符号除法指令与无符号除法指令相同,只是操作数必须为有符号数,商和余数也必须是有符号数,且余数符号与被除数符号相同。

有符号除法指令运算时先将数变为原码,并去掉符号位,然后再两数(绝对值)相除,其结果的符号按两数符号位异或运算规则确定。如果符号位为1(负数),则再取补码。此过程由计算机执行指令时自动完成。3.3.2算术运算类指令4.BCD码(十进制)调整指令

如何方便地将二进制数转换为人们日常生活中习惯使用的十进制数呢?80X86指令系统专门提供了一组相应的十进制调整指令:DAA、DAS、AAA、AAS、AAM和AAD。该类指令都是隐含寻址,BCD码总是作为无符号数看待的。学习该类指令时应重点理解并掌握它们的用途,即指令执行后的结果。指令操作过程是计算机自动完成的,只需了解即可。3.3.2算术运算类指令1)压缩BCD码调整指令●加法的十进制调整指令(decimaladjustforaddition)——DAA

指令格式:DAA

指令功能:该指令之前必须先执行ADD或ADC指令,加法指令将两个压缩的BCD码相加,并将结果存放在AL寄存器中,而后DAA将AL中的和调整到压缩的BCD格式。

3.3.2算术运算类指令执行指令时CPU对AL中高4位、低4位进行检测,判断是否为有效的BCD码。如果AL中低4位大于9或AF = 1,则将AL寄存器的内容加06H,并将AF置1;如果AL中高4位大于9或CF = 1,则将AL寄存器的内容加60H,并将CF置1;如果AL中高低4位均大于9,则将AL寄存器的内容加66H。

3.3.2算术运算类指令

0100100048H

MOVAL,48H+0111010074H

MOVBL,74H10111100BCH

ADDAL,BL+0110011066H

DAA

100100010

122H

最后结果为:

(AL)=22H,CF=1,AF=1●减法的十进制调整指令(decimaladjustforsubtraction)——DAS

指令格式:DAS

指令功能:该指令之前必须先执行SUB或SBB指令,减法指令将两个压缩的BCD码相减,并将结果存放在AL寄存器中,而后DAS将AL中的差调整到压缩的BCD格式。

3.3.2算术运算类指令

执行指令时,CPU对AL中高4位、低4位进行检测,判断是否为有效的BCD码。如果AL中低4位大于9或AF=1,则将AL寄存器的内容减去06H,并将AF置1;如果AL中高4位大于9或CF=1,则将AL寄存器的内容减去60H,并将CF置1;如果AL中高低4位均大于9,则将AL寄存器的内容减去66H3.3.2算术运算类指令2)非压缩BCD码调整指令●加法的ASCII码调整指令(ASCIIadjustforaddition)—AAA

指令格式:AAA

指令功能:将两个ASCII码或非压缩BCD码相加之和存放在AL中,而后进行调整,形成一个扩展的非压缩BCD码,调整后的结果低位在AL中,高位在AH中。

执行指令时,CPU对AL中的低4位进行检测。如果AL中低4位大于9或AF = 1,则将AL寄存器的内容加6,AH寄存器的内容加1,并将AF置1,同时将AL中的高4位清零,CF置1。3.3.2算术运算类指令●减法的ASCII码调整指令(ASCIIadjustforsubtraction)——AAS

指令格式:AAS

指令功能:将两个ASCII码或非压缩BCD码相减之差存放在AL中,而后进行调整,形成一个扩展的非压缩BCD码,调整后的结果低位在AL中,高位在AH中。

执行指令时,CPU对AL中的低4位进行检测。如果AL中低4位大于9或AF = 1,则将AL寄存器的内容减去06H,AL寄存器的内容减去01H,并将AF置1,同时将AL中的高4位清零,CF置1。3.3.2算术运算类指令● BCD码乘法调整指令(ASCIIadjustformultiplication)——AAM

指令格式:AAM

指令功能:将存放在AL寄存器中两个一位非压缩BCD码相乘之积调整为非压缩BCD码。3.3.2算术运算类指令

● BCD码除法调整指令

(ASCIIadjustfordivision)——AAD

指令格式:AAD

指令功能:将AX中存放的两位非压缩BCD码调整为二进制数。3.3.2算术运算类指令5.符号扩展指令

80X86指令系统提供了一组符号扩展指令:CBW、CWD、CWDE和CDQ。该类指令都是隐含寻址,常用于除法运算,指令执行后不影响标志位。其中CWDE和CDQ用于80386及其后继机型中。3.3.2算术运算类指令

1)字节转换为字指令

(convertbytetoword)——CBW

指令格式:CBW

指令功能:将AL中的8位数符号扩展为16位数,形成AX中的字。3.3.2算术运算类指令

2)字转换为双字指令

(convertwordtodoubleword)——CWD

指令格式:CWD

指令功能:将AX中的16位数符号扩展为32位数,形成DX:AX中的双字。

3.3.2算术运算类指令3.3.3逻辑运算和移位类指令

1.逻辑运算指令

逻辑运算指令包括AND(与)、OR(或)、NOT(非)、XOR(异或)和TEST(测试)等指令。可以对8位、16位操作数进行逻辑运算,除NOT不影响标志位外,其余指令将使CF=OF=0,影响SF、ZF、PF。

1)逻辑与指令——AND

指令格式:AND

DSTSRC;(DST)←(DST)∧(SRC)

指令功能:将目的操作数与源操作数按位相与,结果送目的操作数;该指令可用来使操作数的某些位被屏蔽。3.3.3逻辑运算和移位类指令

2)逻辑或指令(or)——OR

指令格式:ORDST,SRC

;(DST)←(DST)∨(SRC)

指令功能:将目的操作数与源操作数按位相或,结果送目的操作数;该指令可用来使操作数某些位置1。

3)逻辑非指令(not)——NOT

指令格式:NOTDST

指令功能:将目的操作数按位取反;该指令常用来将某个数据取成反码。3.3.3逻辑运算和移位类指令

4)异或指令(exclusiveor)——XOR

指令格式:XORDST,SRC

指令功能:将目的操作数与源操作数按位相异或,结果送目的操作数;该指令可用来使操作数某些位变反。

5)测试指令(test)——TEST

指令格式:TESTDST,SRC

指令功能:将目的操作数与源操作数按位相与,只影响标志位,但结果不保存;该指令可用来屏蔽某些位,或使某些位置1或测试某些位等。

3.3.3逻辑运算和移位类指令

XORAX,AX

;清零AX,CF

ANDAL,0FH

;屏蔽高4位,保留低4位,

TESTAL,01H

;测AL最低位

ORAL,0FH

;保留高4位,使低4位置1,3.3.3逻辑运算和移位类指令2.移位指令逻辑左移指令

SHL逻辑右移指令

SHR算术左移指令

SAL算术左移指令

SAR不带进位循环左移指令

ROL不带进位循环右移指令

ROR带进位循环左移指令

RCL带进位循环右移指令

RCR

S:ShiftR:RotateL:LeftR:RightA:ArithmeticC:Carryflag3.3.3逻辑运算和移位类指令

1)算术移位和逻辑移位

算术移动N位,相当于把二进制数乘以或除以2N,把操作数看做有符号数;逻辑移位操作则用于截取字节或字中的若干位,把操作数看做无符号数。所有的移位指令在移位时,都会影响标志位CF、OF、PF、SF和ZF。3.3.3逻辑运算和移位类指令

①算术/逻辑左移指令

(shiftarithmetic/logicalleft)——SAL/SHL

指令格式:SAL/SHLDST,CNT

指令功能:按照CNT规定的移位次数,对目的操作数DST进行左移,每移一次,最高位MSB移入CF,而最低位LSB补0。移位位数CNT放在CL寄存器中,如果只移1位,也可以直接写在指令中。CFDST03.3.3逻辑运算和移位类指令CFDST0

②逻辑右移指令(shiftlogicalright)——SHR

指令格式:SARDST,CNT

指令功能:按照CNT规定的移位次数,对目的操作数DST进行右移,每移一次,最高位MSB补0,最低位LSB移入CF。3.3.3逻辑运算和移位类指令

③算术右移指令(shiftarithmeticright)——SAR

指令格式:SARDST,CNT

指令功能:按照CNT规定的移位次数,对目的操作数DST进行右移,每移一次,最高位MSB(符号位)保持不变,最低位LSB移入CF。CFDST3.3.3逻辑运算和移位类指令

【例】设一个字节数据X存放在AL寄存器中,完成(AL) × 10的功能,即10X。可用移位实现乘10操作,因为10 = 8 + 2 = 23 + 21

XOR AH,AH

SAL AX,1 ;2X

MOV BX,AX

MOV CL,2

SAL AX,CL ;8X

ADD AX,BX ;8X+2X=10X3.3.3逻辑运算和移位类指令

3)循环移位指令

循环移位指令在移位时移出的目的操作数并不丢失,而循环送回目的操作数的另一端。循环移位指令仅影响CF和OF。3.3.3逻辑运算和移位类指令

①循环左移指令(rotateleft)——ROL

指令格式:ROLDST,CNT

指令功能:目的操作数每向左移位一次,其最高位MSB移入最低位LSB,MSB同时也移入CF。CFDST3.3.3逻辑运算和移位类指令

②循环右移指令(rotateright)——ROR

指令格式:RORDST,CNT

指令功能:目的操作数每向右移位一次,其最低位LSB移入最高位MSB,LSB同时也移入CF。CFDST3.3.3逻辑运算和移位类指令

③带进位循环左移指令

(rotateleftthroughcarry)——RCL

指令格式:RCLDST,CNT

指令功能:目的操作数每向左移位一次,其最高位MSB移入CF,CF移入最低位LSB。CFDST3.3.3逻辑运算和移位类指令

④带进位循环右移指令

(rotaterightthroughcarry)——RCR

指令格式:RCRDST,CNT

指令功能:目的操作数每向右移位一次,其最低位LSB移入CF,CF移入最高位MSB。CFDST3.3.3逻辑运算和移位类指令【例】将BX的高8位与低8位互换。

MOVBX,1234H ;(BX)=1234H

MOVCL,8

ROLBX,CL ;(BX)=3412H3.3.3逻辑运算和移位类指令

串操作指令就是对一个字符串进行操作、处理。字符串可以是字串或字节串。字串操作允许对连续存放在存储器中大的数据块进行操作。80X86通过加重复前缀来实现串操作。所有串操作指令都用寄存器SI对源操作数进行间接寻址,并且默认是在DS段中;用DI为目的操作数进行间接寻址,并且默认是在ES段中。串操作指令是唯一的一组源操作数和目的操作数都在存储器中的指令。

3.3.4串操作类指令

串操作时,地址的修改往往与方向标志DF有关,当DF=1时,SI和DI作自动减量修改;当DF=0时,SI和DI作自动增量修改。一条带重复前缀的串操作指令的执行过程往往相当于执行一个循环程序。在每次重复之后,都会修改地址指针SI和DI,要用CX寄存器作为重复次数计数器,指令每执行一次,CX的内容减1,直到其值减为0。3.3.4串操作类指令

1.重复前缀指令

重复前缀指令控制其后的串指令重复执行。

1)重复前缀指令(repeat)——REP

功能:重复其后指令串的操作直至(CX) = 0;用于串传送、串装入、串存储指令前。

(1)判条件,若(CX) = 0,则退出REP,否则往下执行;

(2) (CX)←(CX)-1;

(3)执行其后串指令;

(4)重复(1)~(3)。3.3.4串操作类指令

2)相等/为零则重复前缀指令

(repeatwhileequal/zero)——REPE/REPZ

功能:相等/为零则重复串操作;用于串比较、串扫描指令前。

操作:与REP类同,区别在于判断条件,当(CX) ≠ 0且ZF = 1时,重复执行。

3)不相等/不为零则重复前缀指令

(repeatwhilenotequal/notzero)——REPNE/REPNZ

功能:不相等/不为零则重复串操作;用于串比较、串扫描指令前。

操作:与REP类同,区别在于判断条件,当(CX)≠0且ZF=0时,重复执行。3.3.4串操作类指令2.串操作指令1)串传送指令(movestring)——MOVS指令格式:MOVS DST,SRC

MOVSB(字节);

((ES):(DI))←((DS):(SI)),

(SI)←(SI)±1,(DI)←(DI)±1

MOVSW(字);((ES):(DI))←((DS):(SI)),

(SI)←(SI)±2,(DI)←(DI)±2

3.3.4串操作类指令执行串指令之前,应先进行如下设置:

(1)源串首地址(末地址)→SI;

(2)目的串首地址(末地址)→DI;

(3)串长度→CX;

(4)建立方向标志(CLD使DF = 0,STD使DF = 1)。串操作指令前面可加重复前缀完成串传送功能。3.3.4串操作类指令

【例】将DS:0100H地址开始的50个字传送到ES:2000H开始的内存单元中。

MOV SI,0100H

MOV DI,2000H

MOV CX,50

CLD

REP MOVSW3.3.4串操作类指令

2)串装入指令(loadfromstring)——LODS

指令格式:

LODS SRC

LODSB(字节);

(AL)←((DS):(SI)),(SI)←(SI)±1

LODSW(字);(AX)←((DS):(SI)),(SI)←(SI)±2

3.3.4串操作类指令3)串存储指令(storeintostring)——STOS

指令格式:

STOS DST

STOSB(字节);

((ES):(DI))←(AL),(DI)←(DI)±1

STOSW(字);

((ES):(DI))←(AX),(DI)←(DI)±2

3.3.4串操作类指令4)串比较指令(comparestring)——CMPS

指令格式:

CMPS DST,SRC

CMPSB(字节);

((ES):(DI))-((DS):(SI)),

(SI)←(SI)±1,(DI)←(DI)±1

CMPSW(字);((ES):(DI))-((DS):(SI)),(SI)←(SI)±2,(DI)←(DI)±2

3.3.4串操作类指令5)串扫描指令(scanstring)——SCAS指令格式:

SCAS DST

SCASB(字节);

(AL)-((ES):(DI)),(DI)←(DI)±1

SCASW(字);(AX)-((ES):(DI)),(DI)←(DI)±2

3.3.4串操作类指令

转移指令用于分支程序,它分为无条件转移和条件转移。无条件转移可转到内存中存放的任何程序段。条件转移指令对于条件的判别主要是根据标志位来判别的,对于CF、OF、PF、SF、ZF都有相应的判别指令。3.3.5控制转移类指令

1.无条件转移指令(1)JMP(jump)指令

指令格式:JMP DST

指令功能:无条件跳转到指令指定的目标地址DST去执行指令。DST可以是标号、通用寄存器或存储器。前面已经详细介绍了四种程序转移寻址方式:段内直接寻址、段内间接寻址、段间直接寻址及段间间接寻址。3.3.5控制转移类指令①段内直接转移指令

JMPnearlabel②段内直接短转移指令

JMPshortlabel③段内间接转移指令

JMPreg16JMPmem16④段间直接转移指令

JMPFARPTRlabelname⑤段间间接转移指令

JMPmem323.3.5控制转移类指令

(2)子程序调用指令

主程序用CALL指令来调用子程序。

CALL指令的功能是先将断点地址(

(IP)与(CS))压入堆栈,然后将子程序的首址装入IP与CS中,从而将程序转移到子程序的入口,再顺序执行子程序。在子程序的最后应安排一条返回指令RET,CPU执行RET指令时,会从堆栈中弹出断点地址,重新装入IP与CS中,从而达到返回主程序的目的。3.3.5控制转移类指令3.3.5控制转移类指令

①调用指令(call)——CALL

指令格式:CALLDST

执行操作:(1) PUSHCS

(2) PUSHIP

(3) JMP DST

目的操作数的寻址方式与JMP相似,只是没有短程调用。3.3.5控制转移类指令

②返回指令(return)——RET

指令格式:RET

执行操作:(1) POPIP

(2) POP CS

3.3.5控制转移类指令

2.条件转移指令(jumpifcc)——Jcc

指令格式:Jcc DST

指令功能:如果测试条件cc为真,则转移到目标地址DST处执行程序,否则顺序执行。DST应给出转移到的指令的标号或转移的8位相对偏移量。3.3.5控制转移类指令

条件“cc”共分三类。

(1)以状态标志位为条件:ZF、SF、OF、CF、PF;

(2)以两个无符号数比较为条件:高于、高于等于、低于、低于等于;

(3)以两个有符号数比较为条件:大于、大于等于、小于、小于等于。3.3.5控制转移类指令类

指令格式指令功能条件转移JZ/JEtargetJNZ/JNEtargetJP/JPEtargetJNP/JPOtargetJOtargetJNOtargetJCtargetJNCtargetJStargetJNStargetJB/JNAEtargetJNB/JAEtargetJA/JNBEtargetJNA/JBEtargetJL/JNGEtargetJNL/JGEtargetJG/JNLEtargetJNG/JLEtarget结果为0/相等转移不为0/不相等转移结果为偶性转移结果为奇性转移溢出转移无溢出转移有进(借)位转移无进(借)位转移符号位为1转符号位为0转低于/不高于等于转不低于/高于等于转高于/不低于等于转不高于/低于等于转小于/不大于等于转不小于/大于等于转大于/不小于等于转不大于/小于等于转3.3.5控制转移类指令【例】在DA

温馨提示

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

评论

0/150

提交评论