自己整理的指令

1   通用数据传送指令

MOVmove                                                      传送//不影响标志位

MOV mem/reg1, mem/reg2两个操作数必有一个是寄存器,且这种方式不允许指定段寄存器 

reg, datadata为立即数 ac, memac为累加器mem, ac  segreg, mem/reg(不允许用CS寄存器) 

mem/reg, segreg     mem/reg, data(这种方式目的操作数只用存储器寻址方式而不用寄存器方式)

MOVSX (move with sign-extended)      带符号扩展传送//不影响标志位

MOVSX  reg1, reg2   reg, mem (原操作数是带符号数,所以做符号扩展)

MOVZXmove with zero-extended    带零扩展传送//不影响标志位

MOVSX  reg1, reg2  reg, mem (原操作数是无符号整数所以做零扩展,不管原操作熟符号位是否为1)

PUSH (push onto the stack)         进栈//不影响标志位

push    reg    mem          data   segreg

POP (pop from the stack)               出栈//不影响标志位

pop    reg    mem     segreg

其中段地址存放于SS寄存器中。       SP(16)ESP(32)的内容在任何时候都指向当前栈顶。

堆栈的存取在16位指令中必须以字为单位(不允许字节堆栈),在32位指令中必须以双字为单位。

8086不允许PUSH指令使用立即数寻址方式,286及后继机型允许立即数进栈。

PUSHA/PUSHAD(push all registers)   所有寄存器进栈//不影响标志位  

PUSHA:进栈次序:AX,CX,DX,BX,指令执行前的SP,BP,SI,DI.指令执行后(sp)←(SP)-16仍指向栈顶

PUSHAD:32位,进栈次序同PUSHA

POPA/POPAD(pop all registers)       所有寄存器出栈//不影响标志位

POPA(16)出栈次序:DI,SI,BP,SP,BX,DX,CX,AX. 指令执行后(sp)←(SP)+16仍指向栈顶

POPAD32位,进栈次序同POPA.

XCHGexchange                交换//不影响标志

执行操作 OPR1)←→(OPR2)这两个操作数必有一个在寄存器中,不允许使用段寄存器。该指令可用于除立即数外的任何寻址方式。

 

2   累加器专用传送指令

IN(input)                          输入//不影响标志位

OUToutput                    输出//不影响标志位

这两个指令只限于累加器EAXAXALIN指令完成从I/OCPU的信息传送,而OUT指令完成从CPUI/O信息传送。CPU只能用累加器接受或发送信息。

XLATtranslate                换码//不影响标志位

在使用这条指令前应先建立一个字节表格,其首地址提前存入BX/EBX,需要转换代码应该是相对于表格首地址的位移量也提前存放在AL中,表格内容则是所要换取的代码,指令执行完后就可在AL中得到转换后的代码。32位:( AL )( (EBX) + (AL) ).

 

3   地址传送指令

LEA(load effective addresss)            有效地址送寄存器//不影响标志位  

目的操作数:可用于16位或32位寄存器,但不能使用段寄存器。源操作数:除立即数和寄存器外的任一种存储器寻址方式。

注意1LEA   BX[BX+SI+0F62H]这里BX寄存器得到的是有效地址而不是该存储单元内容。如果是MOV  BX[BX+SI+0F62H],则BX中得到是偏移地址为ⅹⅹⅹ那个单元内容而不是其偏移地址。

注意2 : 比较  LEA  BX, LIST  MOV  BX, OFFSET  LIST

 这两条指令功能上相同,且MOV指令速度快,但OFFSET只能与简单的符号地址相连,而不能和诸如LIST[SI][SI]等复杂操作数相连。   

LDS(load DS with pointer)              指针送寄存器和DS//不影响标志位

LES(load ES with pointer)              指针送寄存器和ES//不影响标志位 

LFS(load FS with pointer)               指针送寄存器和FS//不影响标志位

LGS(load GS with pointer)              指针送寄存器和GS//不影响标志位

LSS(load SS with pointer)               指针送寄存器和SS//不影响标志位

该组指令的源操作只能用存储器寻址方式。目的寄存器不允许使用段寄存器。

 

4   标志寄存器传送指令

LAHF(load AH with flags)               标志送AH//不影响标志位

执行操作:(AH)(FLAGS低字节)

SAHF(store AH into flags)               AH送标志寄存器//由装入值来确定标志位值

执行操作:(FLAGS低字节)(AH)

PUSHF/PUSHFD                      标志进栈//由装入值来确定标志位值

执行操作: PUSHF      (SP)(SP)2          ( (SP)+1), (SP) )(FLAGS)

PUSHFD     (ESP)(ESP)4      ( (ESP+3), (ESP+2), (ESP+1), (ESP) ) (EFLAGS AND   OFCFFFFH)(VMRF )

POPF/POPFD(pop the flags or eflags)      标志出栈//由装入值来确定标志位值

执行操作:POPF      (FLAGS)( (SP)+1),  (SP) )                         (SP)(SP)+2

                                     POPFD    (EFLAGS)((ESP)+3,(ESP+2),(ESP+1),(ESP))           (ESP)(ESP)+4

POPFD指令不影响VM,RF,IOPL,VIFVIP的值。

 

 类型转换指令

CBW(convert byte to word)                   字节转换为字//不影响标志位

执行操作:AL的内容扩展到AH,形成AX中的字。即如果(AL)的最高有效位为0,(AH)=0;如果为1(AH)=OFFH

CWD/CWDE(convert word to double word)     字转换为双字//不影响标志位

执行操作:AX的内容扩展到DX,形成DX:AX的双字。即若(AX)的最高有效位为0,(DX)=0;若为1,(DX)=0FFFFH

CDQ(convert double to quad)           双字转换为4字//不影响标志位

执行操作:EAX的内容扩展到EDX,形成EDX:EAX中的4字。

BSWAP(byte swap)               字节交换//不影响标志位

BSWAP  EAX。字节次序变反,具体为1,4字节互换,2,3字节互换。该指令只能用于486及其后继机型。

 

                                 

算术指令

1 加法指令

ADD(add)                           加法//影响条件标志位

ADC(add with carry)         带进位加法//影响条件标志位

注:ADC这条指令里,其中CF为进位位的值。

INC(increment)           加1//影响条件标志位(除了CF标志)

(上3条)可做字或字节运算。OF位可以用来表示带符号数溢出,CF位则可以用来表示无符号数的溢出。

XADD(exchange and add)       交换并相加//影响条件标志位

该指令源操作数只能用寄存器寻址方式,目的操作数可用寄存器或任一种存储器寻址方式。

执行操作:TEMP(SRC)+(DST)                                   (SRC)(DST)        (DST)TEMP

2 减法指令

SUB(subtract)                                  减法//影响条件标志位

SBB(subtract with borrow)                   带借位减法//影响条件标志位

执行操作:(DST)(DST)(SRC)CF

DEC(decrement)                            减1//影响条件标志位(除了CF标志)

NEG(negate)                                 求补  //影响条件标志位

执行操作:(OPR)←-(OPR)亦即把操作数按位求反后末位加1,因而执行可表示为(OPR)0FFFFH(OPR)+1

只有当操作数为0时,求补运算结果使CF=0,其他情况均为1。

CMP(compare)                              比较//影响条件标志位

(OPR1)(OPR2),不保存结果,只是根据结果设置条件标志位。其后往往跟着条件转移指令。

CMPXCHG(compare and exchange)              比较并交换 //影响条件标志位  

该指令只能用于486及其后继机型。SRC只能用8,16,或32位寄存器。DST则可用寄存器或任何一种存储器寻址方式。执行操作:累加器和DST比较                                    

CMPXCHG8B(compare and exchange 8 byte)     比较并交换8字节 //影响ZF标志位  

该指令只能用于Pentium及其后继机型。源操作数存放于EDX,EAX中64位字,目的操作数可用存储器寻址方式确定一个64位字。执行操作EDX,EAXDST相比较。

注:条件码。OF标志位同加法指令,这里若两个数符号相反而结果的符号与减数相同,则OF=1;除上述情况外OF=0。OF=1说明带符号数的减法溢出,结果错误。

减法的CF值反映无符号运算中的借位情况,因此当作无符号数运算时,若减数>被减数,此时有借位,则CF=1;否则CF=0。即有进位时CF=0,无进位时CF=1。

另外注意8086中处理双字的方法(也适用于386及其后继机型中对4字的处理)。

 

3 乘法指令

MUL(unsigned multiple)          无符号数乘法//对除CFOF以外的条件码位无定义

IMUL(signed  multiple)          带符号数乘法//对除CFOF以外的条件码位无定义

执行操作:  字节操作数:(AX)←(AL)*(SRC),字操作数和双字操作数操作同字节操作数。

目的操作数必须是累加器(累加器为隐含),字运算为AX,字节运算为AL。两个8位数相乘得到16位数存放在AX中,两个16位数相乘得到32位数存放在DX,AX中,其中DX存放高位字,AX存放低位字。386以后可做双字运算。

对于80286及其后继机型,IMUL除上述单操作数指令(累加器为隐含),还有双操作数和三操作数。如:

IMUL    REG,SRC            IMUL REG,SRC,IMM

IMUL  REG,SRC  执行操作: 

字操作数:(REG16)(REG16)*(SRC)          双字操作数:(REG32)(REG32)*(SRC)

其中目的操作数必须是16位或32位寄存器;源操作数可用任一种寻址方式取得和目的操作数长度相同

的数;但如源操作数为立即数时,除相应地用16位或32位立即数外,指令中也可指定8位立即数,在运算时机器会自动把该数符号扩展成与目的操作数长度相同的数。

IMUL  REG,SRC,IMM  执行操作:

字操作数:(REG16)(SRC)*IMM          双字操作数:(REG32) (SRC)*IMM

目的和源操作数同上,IMM表示立即数,可以为8,16,32,运算时必须和目的操作数长度一致。

注:条件码。对于MUL指令,如果乘积的高一半为0,即字节操作的(AH)或字操作的(DX)或双字操作的(EDX)为0,则CF和OF均为0;否则CF和OF均为1。

对于IMUL指令,如果乘积的高一半是低一半的符号扩展,则CF和OF均为0,否则就为1。

机器规定:16位操作数相乘得到的乘积在16位之内或32位操作数相乘得到的乘积在32位之内时,OFCF位置0,否则置1,这时的OF位为1是说明溢出的。其它标志位无定义。

4   除法指令

DIV(unsigned divide)              无符号数除法//对所有条件码均无定义

执行操作:(商和余数均为无符号数)

         字节操作16位被除数在AX中,8位除数为源操作数,结果的8位商在AL中,8位余数在AH中。表示为:(AL)(AX)/(SRC)的商      (AH)(AX)/(SRC)的余数

         字操作32位被除数在DXAX中。其中DX为高位字;16位除数为源操作数,结果的16位商在AX中,16位余数在DX中。表示为:   (AX)(DX,AX)/(SRC)的商         (DX)(DX,AX)/(SRC)的余数

         双字操作64位被除数在EDXEAX中。其中EDX为高位双字;32位除数为源操作数,结果的32位商在AX中,32位余数在EDX中。表示为:(EAX)(EDX,EAX)/(SRC)的商  (EDX)(EDX,EAX)/(SRC)的余数

IDIV(signed divide)               带符号数除法//对所有条件码均无定义

执行操作:同DIV,但操作数必须是带符号数,商和余数也都是带符号数,且余数的符号和被除数的符号相同。

除法指令寻址方式同乘法指令。由于除法指令的字节操作要求被除数为16位,字操作要求被除数为32位,双字操作要求被除数为64位,因此往往需要用符号扩展方法取得除法指令所需的被除数格式。

另外需注意一个问题,除法指令要求字节操作时商为8位,字操作时商为16位,双字操作时商为32位。如果字节操作时,被除数的高8位绝对值≥除数绝对值;或者字操作时,被除数的高16位绝对值≥除数绝对值;或者双字操作时,被除数高32位绝对值≥除数绝对值,则商就会产生溢出。

 

5  十进制调整指令

1 .压缩的BCD码调整指令

DAA(decimal adjust for addition) 加法的十进制调整指令//OF标志位无定义,影响其它位

执行操作:(AL)←把AL中的和调整到压缩的BCD格式,这条指令之前必须执行ADDADC指令,加法指令必须把两个压缩的BCD码相加,并把结果存放在AL寄存器中。

         本指令调整方法:如果AF标志(辅助进位位)1,或者ALa存器的低4位是16进制的AF,则使AL寄存器的内容加06H,且将AF位置1;如果CF标志为1,或者AL寄存器的高4位是16进制的AF,则AL寄存器内容加60H,并将CF位置1                   

DAS(decimaladjust for subtraction)减法十进制调整指令//OF标志位无定义,影响其它位
执行操作:(AL)←把AL中的差调整到压缩的BCD格式。执行这条指令前必须先执行SUBSBB指令,

减法指令必须把两个BCD码相减,并把结果存放在AL寄存器中。本指令调整方法同DAA指令。

 

2 .非压缩的BCD码调整指令

AAAASCII adjust for addition            加法的ASCII调整指令//除影响AFCF标志

                                                                         外,其余标志位无定义

执行操作:(AL)←把AL中的和调整到非压缩的BCD格式    AH)←(AH+ADC生的进位值

执行这条指令前必须先执行ADDADC指令,加法指令必须把两个非压缩的BCD码相加,并把结果存

放在AL寄存器。

本指令的调整步骤:①如AL寄存器的底4位在09之间,且AF位为0,则跳过第②步,执行第③步;

AL寄存器的低4位在十六进制数AF之间或AF1,则AL寄存器的内容加6AH寄存器的内容加1

并将AF位置1

清除AL的高4

④AF的值送CF

AAS(ASCII adjust for subtraction)             减法的ASCII调整指令//除影响AFCF标志外,其余标志位无定义

执行操作:(AL)←把AL中的差调整到非压缩的BCD格式    AH)←(AH)-调整产生的借位值

 

执行这条指令前必须先执行SUBSBB指令,减法指令必须把两个非压缩的BCD码相减,并把结果存放                                                                                           

AL寄存器。

本指令的调整步骤:①如AL寄存器的底4位在09之间,且AF位为0,则跳过第②步,执行第③步;

AL寄存器的低4位在十六进制数AF之间或AF1,则AL寄存器的内容减6AH寄存器的内容减1

并将AF位置1

清除AL的高4

④AF的值送CF

AAM(ASCII adjust for multiplication) 乘法的ASCII调整指令//根据AL寄存器的内容设置条件

                                               SFZFPF,但OFCFAF位无定义

执行操作:(AX)←把AL中的积调整到非压缩的BCD码。

在执行这条指令之前,必须先执行MUL指令,把两个非压缩的BCD码相乘(此时要求其高4位为0),结果

放在AL寄存器中。

本指令调整方法:把AL寄存器的内容除以0AH,商放在AH寄存器中。

AAD(ASCII adjust for division)     除法的ASCII调整指令//根据AL寄存器的内容设置条件                                               SFZFPF,但OFCFAF位无定义

执行操作:(AH)←10*AH+AL             AH)←0

如果被除数是存放在AX寄存器中的二位非压缩BCD数,AH中存放十位数,AL中存放个位数,而且要求AHAL中的高4位均为0。除数是一位非压缩的BCD数,同样要求高4位为0。在把这两个数用DIV指令相除以前,必须先用AAD指令把AX中的被除数调整成二进制数,并存放在AL寄存器里。因此,AAD指令执行如上。

 

                                                        逻辑指令

1  逻辑运算指令

ANDand                      逻辑与//使CFOF0AF位无定义

执行操作:(DST)←(DSTSRC

AND指令可以使操作数的某些位被屏蔽。只需要把AND指令的源操作数设置成一个立即数,并把需要屏蔽的位设为0,这样指令执行的结果就可以把操作数的相应位置0,其他各位保持不变.

OR (or)                           逻辑或//使CFOF0AF位无定义

执行操作:(DST)←(DSTSRC

OR指令可以使操作数的某些位置1,其他位保持不变.只需把OR指令的源操作数设置为一个立即数,并把需要置1的位设为1,就可达到目的.

NOT (not)                         逻辑非//不影响标志位

执行操作:(OPR)←(OPR

XOR (exclusive or )                  异或//使CFOF0AF位无定义

DST)←(DSTSRC

要使操作数的某些位变反,可以用XOR指令,只要把源操作数的立即数字段的相应位置成1就可以达到目的.

XOR指令还可以测试某一操作数是否与另一确定的操作数相等.这种操作在检查地址是否匹配时常用.

TEST( test)                         测试//使CFOF0AF位无定义

执行操作:(OPR1)(OPR2)

用途:要测试操作数的某些位是否为0,可用TEST指令,同样把TEST指令的源操作数设置成一个立即数,其中需要测试的位应设为1.要测试操作数的某位是否为1,可先把该操作数求反,然后用TEST指令测试.这里常用于条件转移.

 

2                  位测试并修改指令

BTbit test                         位测试//影响CF值,对其它位无定义

执行操作:把目的操作数中由源操作数所指定位的值送往标志位CF

BTSbit test and set                 位测试并置1//影响CF值,对其它位无定义

执行操作:把目的操作数中由源操作数所指定位的值送往标志位CF,并将目的操作数中的该位置1

BTR bit test and reset              位测试并置0//影响CF值,对其它位无定义

执行操作:把目的操作数中由源操作数所指定位的值送往标志位CF,并将目的操作数中的该位置0

BTC bit test and complement        位测试并变反//影响CF值,对其它位无定义

执行操作:把目的操作数中由源操作数所指定位的值送往标志位CF,并将目的操作数中的该位变反。

本组指令中的SRC可以使用寄存器方式或立即数方式,即可以在指令中用8位立即数直接指出目的操作数所要测试位的位位置。也可以用任一字寄存器或双字寄存器的内容给出同一个值。目的操作数则可用除立即数外的任一种寻址方式指定一个字或双字。由于目的操作数的字节最大为32位,所以位位置的范围应是031

 

3              位扫描指令

BSF bit scan forward               正向位扫描//影响ZF位,其他标志位无影响

执行操作:指令从位0开始自右向左扫描源操作数,目的是检索第一个为1的位。如遇到第一个为1的位则将ZF位置0,并把该位的位位置装入目的寄存器中;如源操作数为0,则将ZF位置1,目的寄存器无定义。

BSR bit scan reverse                反向位扫描//影响ZF位,其他标志位无影响

BSF指令唯一区别是BSR指令检索从高位向低位,而BSF检索从低位开始第一个出现的1

 

4             移位指令

1.移位指令

SHL shift logical left                 逻辑左移//据移位后的结果设置SFZFPF的值

格式:SHL   OPRCNT     

其中OPR用除立即数外的任何寻址方式。移位次数由CNT决定。在8086中可以是1CL。若移位次数大于1,可在该移位指令前把移位次数置于CL寄存器,而移位指令中的CNT写为CL。当然其它机型可以直接把CNT写成用8位立即数指定范围从131的移位次数。

逻辑移位指令适用于无符号数运算。其中SHL用来乘以2

SAL  (shift arithmetic left)         算术左移//根据移位后的结果设置SFZFPF的值

格式同上。算术指令适用于带符号数运算。SAL用来乘以2

SHR  (shift logical right)          逻辑右移//根据移位后的结果设置SFZFPF的值

格式同上。逻辑移位指令适用于无符号数运算。其中SHR用来除以2

SAR  (shift arithmetic right)       算术左移//根据移位后的结果设置SFZFPF的值

格式同上。算术指令适用于带符号数运算。SAR用来除以2

这里最高有效位右移,同时再用它自身值填入。

移位指令常用来乘以2或除以2的操作。

 

 

 


 CF         OPR                   OPR           CF                 OPR          CF

1)逻辑及算术左移               2)逻辑右移                        3)算术右移

 

2.循环移位指令

ROL  (rotate left)      循环左移//CF根据各条指令规定设置,OFCNT=1时有效,否则无定义                

ROR  (rotate right)                循环右移//同上

RCL  ( rotate left through carry)     带进位循环左移//同上

RCR  (rotate right through carry )    带进位循环右移//同上

以上2组指令都可以作字或字节操作,386及后继机型还可以做双字操作。

 

 


      CF     OPR                           OPR         CF

循环左移                       循环右移       

 

 

 


      CF     OPR                           OPR          CF

        带进位循环左移                    带进位循环右移

 

3.双精度移位指令

SHLD (shift left double )         双精度左移//当移位次数为0时,不影响标志位;否则        

                                        根据移位后的结果设置SFZFPFCF

SHRD (shift right double )               双精度右移//同上

格式:  SHLDSHRD     DSTREGCNT

DST可以用除立即数以外任一种寻址方式指定字或双字操作数。源操作数只能使用寄存器方式指定与目的操作数相同长度的字或双字。CNT为移位次数,可以是一个8位立即数,也可是CL,其内容存放移位计数值,范围从131,大于31则自动取模32的值来取代。

这组指令在边界不对准的位串传送中很有用。如所要传送的位串的第一个位的位位置不在字节地址的边界上时,就可以用这组指令来处理。

       DST

DST



 

 

 

T

                                  0                                       0

  CF                                                                         CF

   

       REG

      REG

                                0  0                                      0

    

              双精度左移                                   双精度右移

 

                            串处理指令

特性:

数据类型

        字节

       

      双字

方向(DF

    向前(DF=0

            向后(DF=1

串长度

            1

         重复REPCount Reg)次

源串((source-index)

目的串((destination-index)

在数据段中(可用段跨越前缀修改)

在附加段中

 REP重复串操作直到计数器寄存器count reg的内容为0为止。格式:REP   string  primitive

其中string  primitive可为MOVSSTOSLODSINSOUTS指令。执行操作:(1)(count reg)=0,则退出ERP,否则往下执行  (2)(count reg)(count reg1)   (3)执行其后的串指令   (4)重复(1)(3)

CLDclear direction flag该指令使DF=0,在执行串处理指令时可使地址自动增量

STD set direction flag该指令使DF=0,在执行串处理指令时可使地址自动减量

 

1     MOVS                            串传送指令// 不影响标志位

MOVS DSTSRC   MOVSB(字节)  MOVSW(字) MOVSD386及后继机型可用)
MOVS寻址方式是隐含的。所以这种格式中的DSTSRC只提供给汇编程序做类型检查用,并且不允许用其他寻址方式来确定操作数。

在执行操作前有如下准备工作:

把存放在数据段中的源串首地址(如反向传送则是末地址)放入源变址寄存器

把将要存放数据串的附加段中的目的串首地址(或反向传送时的末地址)放入目的变址寄存器中;

把数据串长度放入计数寄存器中

建立方向标志

功能:把由源变址寄存器指向的数据段中的一个字(或双字,或字节)传送到由目的变址寄存器指向的附加段中的一个字(或双字,或字节)中去。同时根据方向标志及数据格式(或双字,或字节)对源变址寄存器和目的变址寄存器进行修改。

 

2     STOS                             存入串指令//不影响标志位

STOS  DST      STOSB(字节)    STOSW()    STOSD(双字)386及后继机型可用

该指令把ALAXEAX的内容存入由目的变址寄存器指向的附加段的某单元中,并根据DF的值及数据类型修改目的变址寄存器的内容。当它与REP联用时,可把ALAXEAX的内容存入一个长度为(count reg)的缓冲区中。

STOS在初始化某一缓冲区时很有用。

 

3    LODS                          从串取指令//不影响标志位

LODS  SRC    LODSB(字节)     LODSW(字)      LODSD(双字)

该指令把由源变址寄存器指向的数据段中某单元的内容送到ALAXEAX中,并根据方向标志和数据类型修改源变址寄存器的内容。指令允许使用段跨越前缀来指定非数据段的存储区。

 

4    INS                             串输入指令//不影响标志位

INS  DST,DX     INSB(字节)         INSW()         INSD(双字)

把段口号在DX寄存器中的I/O空间的字、字节、双字传送到附加段中的由目的变址寄存器所指向的存储单元中,并根据DF的值和数据类型修改目的变址寄存器的内容。

 

5    OUT                                 串输出指令//不影响标志位

OUTS DXSRC       OUTSB(字节)        OUTSW()            OUTSD(双字)

该指令把由源变址寄存器所指向的存储器中的字节、字或双字传送到端口号在DX寄存器中的I/O端口中去,并根据DF的值和数据类型修改目的变址寄存器的内容。

 

6      REPE/REPZREPNE/REPNZ联合工作的CMPSSCAS指令

1REPE/REPZ                     当相等/0时重复操作    

格式:REPE(或REPZ           string  primitive(可为CMPSSCAS)

执行操作:如(count reg=0ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行。

count reg)←(count reg)-1      执行其后的串指令          重复

2.  REPNE/REPNZ                 当不相等//不为0时重复串操作

格式:REPNE(或REPNZ           string  primitive(可为CMPSSCAS)

执行操作:只要两数比较的结果不相等,就可继续执行串处理指令,如某次两数比较相等或(count reg= 0 时,就可结束操作。退出条件为(count reg=0ZF=1外,其它与REPE完全相同。

3 CMPS                        串比较指令//根据结果设置条件码

CMPS   SRCDST             CMPSB           CMPSW            CMPSD

执行操作:指令把由源变址寄存器指向的数据段中的一个字节、字或双字与由目的变址寄存器所指向的附加段中的一个字节、字或双字相减,但不保存结果,只根据结果设置条件码。指令的其它特性和MOVS指令的规定相同。

4SCAS                         串扫描指令//根据结果设置条件码

SCAS   DST                   SCASB              SCASW         SCASD

执行操作:指令把ALAXEAX的内容与由目的变址寄存器指向的在附加段中的一个字节、字或双字进行比较,并不保存结果,只根据结果设置条件码。指令的其他特性和MOVS的规定相同。

 

                                      控制转移指令

         1段内转移:指同一段的范围内进行转移,此时只需修改IPEIP,用新转移目标地址去替转移分为:

        2段间转移:要转到另一个段去执行程序,要修改IP(EIP)CS寄存器内容。段地址+偏移地址 

1        无条件转移指令

JMPjump                              无条件转移指令//不影响条件码

1)段内直接短转移                       JMP      SHORT     OPR

执行操作:(IP)←(IP+8位位移     如果操作数16位,则还需(EIP)(EIP) AND 0000FFFFH 

8位位移量是由目标地址 OPR确定。转移的目标地址在汇编格式中可直接使用符号地址,而在机器执行时则是当前的IPEIP的值(JMP指令的下一条指令的地址)与指令中指定的8位位移量之和。位移量既可表示向前又可表示向后移,是一个带符号数。所以这种格式只允许在-128到+127字节范围内转移

2)段内直接近转移                       JMP   NEAR   PTR    OPR

执行操作:(IP)←(IP+16位位移     80386及后继机型为:(EIP)(EIP)+32位位移量

如果操作数16位,则还需(EIP)(EIP) AND 0000FFFFH 

同样采用相对寻址8086及其它机型的实模式下段长为64K,所以16位位移量可以转移到段内的任一个位置。在386及后继机型的保护模式下,段的大小可达4G32位位移量可以转到段内任何位置。

3)段内间接近转移                       JMP   WORD   PTR   OPR

执行操作:(IP)←(EA,386及后继机型则为:(EIP)←(EA)。如果操作数16位,则还需(EIP)(EIP) AND 0000FFFFH

其中有效地址EA值由OP R寻址方式确定。它可以使用除立即数方式以外的任一种寻址方式。如果指定是寄存器,则把寄存器的内容送到IPEIP寄存器中;如果指定是存储器中的一个字或双字,则把该存储单元的内容送到IPEIP寄存器中去。

4)段间直接远转移                       JMP    FAR    PTR    OPR

直接      执行操作:(IP)← OPR的段内偏移地址             CS)← OPR所在段的段地址

寻址       386及后继机型为:(EIP)← OPR的段内偏移地址    CS)← OPR所在段的段地址

5)段间间接远转移                       JMP    DWORD   PTR    OPR

执行操作:     IP)←(EA   CS)←(EA+2      操作数16位,则还需

386及后继机型     EIP)←(EA  CS)←(EA+4      ( EIP)(EIP) AND 0000FFFFH

其中有效地址EA值由OP R寻址方式确定。它可以使用除立即数方式以外的任一种寻址方式。根据寻址方式求出EA后,把指定存储单元的字内容送到IPEIP寄存器,并把下一个字内容送到CS寄存器。

2        条件转移指令                  //所有条件转移指令都不影响条件码

条件转移指令使用了相对寻址方式,它只可用JMP中的短转移和近转移两种格式。(在808680286中只提供短转移格式,目标地址应在本条转移指令下一条指令地址的            

128~+127个字节范围之内。80386以后除短转移外还提供近转移,这样就可到达段内任何位置。)但条件转移不提供段间远转移格式。满足测试条件时,IPEIP8位、16位或32位位移量相加得到转向地址;如不满足测试条件,则IPEIP不变。

 

1 根据单个条件标志的设置情况转移。

适用于测试某一次运算的结果并根据其不同特征产生分支作不同处理。

1JZ(或JE)(jump if zero,or equal              结果为零(或相等)则转移

格式:JZ(或JE OPR                      测试条件ZF=1

2JNZ(或JNE)(jump if not zero,or not equal    结果不为零(或不相等)则转移

格式:JNZ(或JNE OPR                   测试条件:ZF=0

3JSjump if sign                            结果为负则跳转

格式:JS    OPR                            测试条件:SF=1

4JNSjump if not sign                        结果为正则跳转

格式:JNS   OPR                            测试条件:SF=0

5JOjump if overflow                          溢出则转移

格式:JO    OPR                             测试条件:OF=1

6JNOjump if not overflow                      不溢出则转移

格式:JNO  OPR                              测试条件:OF=0

7JP(或JPE)(jump if parity,or parity even         奇偶位为1则跳转

格式:JP(或JPE OPR                        测试条件:PF=1

8JNP(或JPO)(jump if not parity,or parity odd     奇偶位为0则跳转

格式:JNP(或JPO OPR                       测试条件:PF=0

9JB(或JNAE,或JC(jump if below,or not above or equal,or carry)

                          低于,或者不高于或者等于,或进位为1则转移

格式:JB(或JNAE,或JC OPR                 测试条件:CF=1

10JNB(或JAE,或JNC(jump if not below,or above or equal,or not carry)

                      不低于,或者高于或等于,或进位为零则转移

格式:JNB(或JAE,或JNC OPR                测试条件:CF=0

 

2 比较两个无符号数,并根据比较结果转移。

(1) JB(或JNAE,或JC(jump if below,or not above or equal,or carry)

(2) JNB(或JAE,或JNC(jump if not below,or above or equal,or not carry)

以上两个指令同上面第一组(9)(10)完全相同

 

(3) JBE(或JNA)(jump if below or equal,or not above

                         低于或等于,或不高于则转移

格式:JBE(或JNA OPR                         测试条件:CFZF=1

 

(4)JNBE(或JA)(jump if not below or equal,or above

                         不低于或等于,或高于则转移

格式:JNBE(或JA  OPR                         测试条件:CFZF=1

 

3                    比较两个带符号数,并根据比较结果转移

(1) JL(JNGE)jump if less,or not greater or equal小于,或者不大于或等于则跳转

格式:JL(JNGE)   OPR                             测试条件:SFOF=1

(2)JNL(或JGE)(jump if not less,or greater or equal不小于或者大于或等于则转移

格:JNL(或JGE OPR                             测试条件:SFOF=0

(3)JLE(或JNG)(jump if less or equal,or not greater小于或等于,或者不大于则转移

格式JLE(或JNG OPR                            测试条件:SFOF)∨ZF = 1

4JNLE(或JG)(jump if not less or equal,or greater不小于或等于,或大于则转移

格式:JNLE(或JG  OPR                           测试条件:SFOF)∨ZF =0

4                    测试CXECX的值为0则转移指令             

1JCXZjump if CX register is zero             CX寄存器的内容为零则转移

格式:JCXZ     OPR                                      测试条件:CX= 0

2JECXZjump if ECX register is zero        ECX寄存器的寄存器内容为零则转移

格式:JECXZ   OPR386J及后继机型可用)                 测试条件:E X= 0   

 

3  条件设置指令本组指令只在386及后继机型才提供)

格式:SETcc  DST

执行操作:DST可使用寄存器或任一种存储器寻址方式,但只能指定一个字节单元。指令根据所指定的条件码情况,如满足条件则把目的字节置为1;如不满足条件则把目的字节置为0。条件设置可分为3组:

1.根据单个条件标志的值把目的字节置1

1SETZ(或SETE(set byte if zero,or equal)       结果为零(或相等)则目的字节置1

测试条件: ZF = 1

2SETNZ(或SETNE(set byte if not zero,or not equal结果不为零或不相等则目的字节置1 

测试条件:ZF = 0

3SETS(set byte if sign)                       结果为负则目的字节置为1

测试条件:SF = 1

4SETNS(Set byte if not sign)                   结果为正则目的字节置为1

测试条件:SF = 0

5SETO(set byte if overflow)                    溢出则目的字节置1

测试条件:OF = 1

6SETNO(set byte if not overflow)              不溢出则目的字节置1

测试条件:OF = 0

7SETP(SETPE)set byte if parity,or parity even奇偶位为1则目的字节置1

测试条件:PF = 1

8SETNP(SETB,或SETNAE) (set byte if parity,or parity odd) 奇偶位为0则目的字节置1

测试条件:PF = 0

9SETC(SETB,或SETNAE) set byte if carry,or below,or not above or equal   

                           进位位为1,或低于,或不高于或等于则目的字节置1

测试条件:CF = 1

10SETNC(SETNB,或SETAE) set byte if carry,or below,or not above or equal

                       进位位为1,或不低于,或高于或等于则目的字节置1 

测试条件:CF = 0

2.比较两个无符号数,并根据比较结果把目的字节置1

1SETC(SETB,或SETNAE) set byte if carry,or below,or not above or equal  

2SETNC(SETNB,或SETAE) set byte if carry,or below,or not above or equal

以上两个指令同上面第一组(9)(10)完全相同

3SETBE(或SETNA(set byte if below or equal,or not above)

                                        低于或等于,或不高于则目的字节置1

测试条件:CFZF=1

4SETNBE(SETA) set byte if not below or equal,or above

                                       不低于或等于,或高于则目的字节置1

测试条件:CFZF=0

 

3.比较两个带符号数,并根据比较结果把目的字节置1

1SETLSETNGE(set byte if less,or not greater or equal)

                                      小于,或不大于或等于则目的字节置1

测试条件:  SFOF = 1

2SETNL SETGE)(set byte if not less,or greater or equal

                                      不小于,或大于或等于则目的字节置1

测试条件:   SFOF = 0

3SETLESETNG)(set byte if less or equal,or not greater

                                      小于或等于,或不大于则目的字节置1

测试条件:SFOF)∨ZF=1

4SETNLESETG(set byte if not less or equal,or greater)

                                      不小于或等于,或大于则目的字节置1

测试条件:SFOF)∨ZF=0

 

5        循环指令                         //循环指令不影响条件码

使用相对寻址方式

1LOOP                          循环

格式:LOOP   OPR                      测试条件:(count Reg)0

2LOOPZ/LOOPE                  当为零或相等时循环指令

格式:LOOPZ(或LOOPE OPR          测试条件:ZF=1(count Reg)0

3LOOPNZ/LOOPNE               当不为零或不相等时循环指令

格式:LOOPNZ(或LOOPNE   OPR     测试条件:ZF=0(count Reg)0

其中第二和第三条指令提供了提前结束循环的可能性。

这三条指令执行步骤:①(count Reg)←(count Reg)-1

②检查是否满足测试条件,如满足且操作数长度为16位,则(IP)←(IP+D8的符号扩展;如满足且操作数长度为32位,则(EIP)←(EIP+D8的符号扩展;

上面OPR必须指定一个表示转向地址的标号(符号地址),而在机器指令里则用8位位移量D8来表示转向地址与当前IP(或EIP)值的差。由于位移量只有8位,所以转向地址必须在该循环指令的下一条指令地址的-128~+127字节范围内。

 

6        子程序

子程序相当于高级语言中的“过程”,(procedure)。程序中可以由调用程序(或称主程序)调用这些子程序,而在子程序执行完后又返回调用程序继续执行。

1.      CALL 调用指令                     //不影响标志位

⑴段直接调用

执行操作:当操作长度为16位时,Push(IP)      (IP)(IP)+D16

                                          (EIP)( (EIP)+D16 )AND0000FFFFH

         操作数长度为32位时,Push(EIP)     (EIP)(EIP)+D32

指令中DST给出转向地址(即子程序的入口地址,亦即子程序的第一条指令的地址),D16即为机器指令

中的位移量,它是转向地址和返回地址之间的差值。

⑵段间接调用

执行操作:当操作长度为16位时,Push(IP)      (IP)(EA)

                                          (EIP)(EA)AND0000FFFFH

         操作数长度为32位时,Push(EIP)     (EIP)(EA)

指令中的DST可使用寄存器寻址方式或任一种存储器寻址方式,由指定的寄存器或存储单元的内容给出转向地址。当操作长度为16位时,则有效地址EA应为16位;操作数长度为32位时,EA应为32位。

以上两种方式均为近调用,转向地址中只包含其偏移地址部分,段地址是保持不变的。

 

⑶段直接调用

执行操作:当操作长度为16位时,         Push(CS)               Push(IP)

    IP)←DST指定的偏移地址           CS)←DST指定的段地址                               

当操作长度为32位时,        Push(CS)              Push(EIP)

     (EIP)DST指定的偏移地址             CS)←DST指定的段地址       

由于调用程序和子程序不在同一段内,因此返回的地址的保存以及转向地址的设置都必须把段地址考虑在内。

⑷段间接调用

执行操作:当操作长度为16位时,         Push(CS)               Push(IP)

    IP)←(EA           CS)←(EA2                              

当操作长度为32位时,        Push(CS)              Push(EIP)

     (EIP)←(EA            CS)←(EA4  

其中EA是由DST的寻址方式确定的有效地址,这里可用任一种存储器寻址方式来取得EA值。

 

2RET 返回指令                               //不影响标志位

RET指令放在子程序的末尾,它使子程序在功能完成后返回调用程序继续执行,而返回地址是调用程序调用子程序(或称转子)时存放在堆栈中的,因此RET指令的操作是返回地址出栈送IPEIP寄存器(段内或段间)和CS寄存器(段间)。

1)段内近返回               格式:RET

执行操作:当操作数长度为16时,(IP)←POP()

                    386及后继机型:(EIP)←(EIPAND0000FFFFH

          当操作数长度为32位时,(EIP)←POP()

2)段内带立即数近返回       格式:RET    EXP

执行操作:在执行完与(1)的RET完全相同的操作后,还需要修改堆栈指针:

              SPESP)←(SPESP)+D16

其中EXP是一个表达式,根据它的值计算出来的常数成为机器指令中的位移量D16。这种指令允许返回地址出栈后修改堆栈的指针,这就便于调用程序在用CALL指令调用子程序以前把子程序所需要的参数入栈,以便子程序运行时使用这些参数。当子程序返回后,这些参数已不在有用,就可以修改指针使其指向参数入栈以前的值。

3)段间远返回               格式:RET

执行操作:当操作数长度为16时,(IP)←POP()

                    386及后继机型:(EIP)←(EIPAND0000FFFFH

                                  CS)←POP()

          当操作数长度为32位时,(EIP)←POP()

                                  CS)←POP()(32位数出栈、高16位废除)

 4)段间带立即数远返回       格式:RET    EXP

执行操作:在执行完与(3)的RET完全相同的操作后,还需要修改堆栈指针:

              SPESP)←(SPESP)+D16

这里EXP的含义及使用情况与带立即数返回指令相同。

 

7        中断                        

中断分为内部中断和外部中断两类。内部中断包括像除法运算中所遇到需要除以0

产生的中断,或者程序中为了做某些处理而设置的中断指令等。外部中断则主要用来处理I/O设备与CPU之间的通信。

       CPU响应一次中断时,也要和调用子程序时类似地把(IP)或(EIP)和(CS)保存入栈。除此之外,为了能全面地保存现场信息,以便在中断处理结束时返回现场,还需要把反映现场状态的(FLAGS)或(EFLAGS)保存入栈,然后才能转到中断例行程序去执行。返回同理要恢复(FLAGS)或(EFLAGS)。

中断例行程序入口地址称为中断向量。在80X86中,在实模式下工作时,存储器的最低地址区的1024个字节(地址从00000H003FFH)为中断向量区,其中存放着256种类型中断例行程序的入口地址(中断向量)。由于每个中断向量占有4个字节单元,所以中断指令中指定的类型号N需要乘以4才能取得所指定类型的中断向量。在保护模式下,中断例行程序的入口通过中断描述符表找到找到中断描述符来取得的。由于每个描述符为8字节长,所以类型号应乘以8才能取得所指定类型的中断描述符。

 

1INT interrupt            中断//不影响除IFTFAC以外的标志位

格式:INT  TYPE INT

执行操作:PUSHFLAGS

          IF0

          TF0

          AC0

          PUSHCS

          PUSHIP

         IP)←(TYPE * 4

         CS)←(TYPE * 42

其中TYPE为类型号,它可以是常数或表达式,其值必须在0255范围内,格式中的INT是一个字节的中断指令,它隐含的类型号为3

2INTOinterrupt if overflow            如溢出则中断//同上

格式:INTO

执行操作:OF = 1,则:PUSHFLAGS

                        IF0

                        TF0

                        AC0

PUSHCS

                        PUSHIP

                       IP)←(10H

                       CS)←(12H

3IRET(return from interrupt)   从中断返回//标志位由堆栈中取出来的值设置

格式:IRET                  适用于操作数长度为16位的情况

执行操作:IP)←POP()      CS)←POP()     FLAGS)←POP()

4IRETD(return from interrupt)  从中断返回 //标志位由堆栈中取出来的值设置

格式:IRETD                 适用于操作数长度为32位的情况

执行操作:IP)←POP()     CS)←POP()      EFLAGS)←POP()

 

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

1.  标志处理指令                   //只影响本指令指定的标志,而不影响其他标志位

·CLCclear carry                  进位位置置零指令     CF0

·CMC (complement carry)              进位位求反指令      CFCF

·STC (set carry)                     进位位置1指令      CF1

·CLD (clear direction)               方向标志位置0指令  DF0

·STD (set direction)                 方向标志位置1指令  DF1

·CLI (clear interrupt)               中断标志置0指令    IF0

·STI (set interrupt)                 中断标志置1指令    IF1

2.  其它处理机控制与杂项操作指令    //以下指令不影响条件码

1NOPno operation           无操作指令

该指令不执行任何操作,其机器码占有一个字节单元,在调试程序时往往用这条指令占有一定的存储单元,以便在正式运行时用其他指令取代。

2HLT halt                   停机

该指令可使机器暂停工作,使处理机处于停机状态以等待一次外部中断的到来,中断结束后继续执行下面.

3WAIT (wait)                    等待

该指令使处理机处于空转状态,它也可以用来等待外部中断发生,但中断结束后仍返回WAIT指令继续等待。

它也可以与ESC指令配合等待协处理机的执行结果。

4ESC (escape)                   换码    

格式:   ESC   op,reg/mem

这条指令在使用协处理机时,可以指定由协处理器执行的指令。指令的第一个操作数即指定其操作码,第二个操作数即指定其操作数。自486起,浮点协处理器已装入CPU芯片,系统可以直接支持协处理器指令,因此ESC指令已成为未定义指令,如遇到程序中的ESC指令将引起一次异常处理。

5LOCK (lock)                       封锁

该指令是一种前缀,它可以与其它指令联合,用来维持总线的锁存信号直到与其联合的指令执行完为止。当CPU与其它协处理机协同工作时,该指令可避免破坏有用信息。

LOCK前缀可与下列指令联用:

BTSBTRBTC     mem,reg/imm

XCHG       reg,mem

XCHG       mem,reg

ADD,OR,ADC,SBB,AND,SUB,XOR    mem,reg/imm

NOT,NEG,INC,DEC    mem

CMPXCHG,XADD

6BOUND(bound)               界限

格式:BOUND    reg,mem

执行操作:BOUND指令检查给出的数组下标是否在规定的上下界之内。如在上下界之内,则执行下一条指令;如超出了上下界范围,则产生中断5。如发生中断,则中断返回时返回地址仍指向BOUND指令,而不是其下一条指令。   指令中第一个操作数必须用寄存器,用来存放当前数组下标。当操作数长度为16位时,使用16位寄存器;而当操作数长度为32位时,则使用32位寄存器。第二个操作数必须使用存储器方式,该操作数用来存放数组的上下界。当操作数长度为16位时,使用相继的两个16位字存放下界和上界,下界存放在低地址所指定的字单元中,上界存放在高地址所指定的字单元中。当操作数为32位时,使用相继的两个双字来存放下界和上界。

 

(7)ENTER   建立堆栈帧指令

ENTER指令用于过程调用时为便于过程间传递参数而建立堆栈帧所用。

格式:ENTER   imm16,imm8

执行操作:指令中给出地两个操作数均为立即数。第一个操作数为16位立即数,由其指定堆栈帧的大小,即其所占据的字节数。第二个操作数为8位立即数,它给出过程的嵌套层数,此数范围应为031

该指令完成以下操作:

①PUSHBP)或PUSHEBP),以保存该寄存器的原始内容。

BP)←(SP)或(EBP)←(ESP),使BPEBP寄存器保存当前堆栈指针SPESP的内容,以便在过程运行期间,以BP(或EBP)为基准访问堆栈帧中存放的变量。

BP)←(SP)-imm16     EBP)←(ESP)-imm16,这样就建立了堆栈帧所占有的存储空间。

 

(8)LEAVE   释放堆栈帧指令

LEAVE指令在程序中位于退出过程的RET指令之前,用来释放由ENTER指令建立的堆栈帧存储区。

格式:LEAVE

执行操作:

SP)←(BP)或(ESP)←(ESP

BP)←POP()或(EBP)←POP()

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值