天天看点

汇编指令数据传送指令 标志位操作指令 算术运算指令 逻辑运算指令 移位操作指令 位操作指令 比较运算指令 循环指令 转移指令 条件设置字节指令 字符串操作指令 ASCII-BCD码运算调整指令 处理器指令  

数据传送指令 

1、传送指令 MOV(Move Instruction)  

MOV Reg/Mem, Reg/Mem/Imm

对MOV指令有以下几条具体规定:

(1)两个操作数的数据类型要相同,要同为8位、16位或32位;如: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  VARA, VARB等,其中VARA和VARB是同数据类型的内存变量。 

2、传送—填充指令(Move-and-Fill Instruction)  

MOVSX/MOVZX Reg/Mem, Reg/Mem/Imm

(1)符号填充指令 MOVSX(Move with Sign-Extend)

MOVSX的填充方式是:用源操作数的符号位来填充目的操作数的高位数据位。

(2)零填充指令 MOVZX(Move with Zero-Extend)

MOVZX的填充方式是:恒用0来填充目的操作数的高位数据位。

3、交换指令XCHG(Exchange Instruction)  

XCHG  Reg/Mem, Reg/Mem

交换指令XCHG是两个寄存器,寄存器和内存变量之间内容的交换指令

4、取有效地址指令LEA(Load Effective Address)  

LEA Reg, Mem

该指令通常用来对指针或变址寄存器BX、DI或SI等置初值之用。

5、取段寄存器指令(Load Segment Instruction)  

LDS/LES/LFS/LGS/LSS Reg, Mem

该组指令的功能是把内存单元的一个“低字”传送给指令中指定的16位寄存器,把随后的一个“高字”传给相应的段寄存器(DS、ES、FS、GS和SS)。

若Reg是16位寄存器,那么,Men必须是32位指针;若Reg是32位寄存器,那么,Men必须是48位指针,其低32位给指令中指定的寄存器,高16位给指令中的段寄存器。

6、堆栈操作指令(Stack Operation Instruction)

(1)进栈操作

PUSH (Push Word or Doubleword onto Stack)

PUSHA (Push All General Registers)

PUSHAD (Push All 32-bit General Registers)

(2)出栈操作

POP (Pop Word or Doubleword off Stack)

POPA (Pop All General Registers)

POPAD (Pop All 32-bit General Registers)

7、转换指令XLAT(Translate Instruction) 

转换指令有两个隐含操作数BX和AL。指令格式如下:

XLAT/XLATB

其功能是把BX的值作为内存字节数组首地址、下标为AL的数组元素的值传送给AL。其功能描述的表达式是:AL←BX[AL]

标志位操作指令 

1、进位CF操作指令

(1)清进位指令CLC(Clear Carry Flag):CF←0

(2)置进位指令STC(Set Carry Flag):CF←1

(3)进位取反指令CMC(Complement Carry Flag):CF←not CF

2、方向位DF操作指令

(1)清方向位指令CLD(Clear Direction Flag):DF←0

(2)置方向位指令STD(Set Direction Flag):DF←1

3、中断允许位IF操作指令

(1)清中断允许位指令CLI(Clear Interrupt Flag):IF←0

其功能是不允许可屏蔽的外部中断来中断其后程序段的执行。

(2)置中断允许位指令STI(Set Interrupt Flag):IF←1

其功能是恢复可屏蔽的外部中断的中断响应功能,通常是与CLI成对使用的。

4、取标志位操作指令

(1)LAHF(Load AH from Flags):AH←Flags的低8位

(2)SAHF(Store AH in Flags):Flags的低8位←AH

5、标志位堆栈操作指令

(1)PUSHF/PUSHFD(Push Flags onto Stack):把16位/32位标志寄存器进栈;

(2)POPF/POPFD(Pop Flags off Stack):把16位/32位标志寄存器出栈;

算术运算指令 

1、加法指令

(1)加法指令ADD(ADD Binary Numbers Instruction)

指令的格式:ADD  Reg/Mem, Reg/Mem/Imm

受影响的标志位:AF、CF、OF、PF、SF和ZF

指令的功能是把源操作数的值加到目的操作数中。

(2)带进位加指令ADC(ADD With Carry Instruction)

指令的格式:ADC  Reg/Mem, Reg/Mem/Imm

受影响的标志位:AF、CF、OF、PF、SF和ZF

指令的功能是把源操作数和进位标志位CF的值(0/1)一起加到目的操作数中。

(3)加1指令INC(Increment by 1 Instruction)

指令的格式:INC  Reg/Mem

受影响的标志位:AF、OF、PF、SF和ZF,不影响CF

指令的功能是把操作数的值加1。

(4)交换加指令XADD(Exchange and Add)

指令的格式:XADD  Reg/Mem, Reg      ;80486+

受影响的标志位:AF、CF、OF、PF、SF和ZF

指令的功能是先交换两个操作数的值,再进行算术“加”法操作。

2、减法指令

(1)减法指令SUB(Subtract Binary Values Instruction)

指令的格式:SUB  Reg/Mem, Reg/Mem/Imm

受影响的标志位:AF、CF、OF、PF、SF和ZF

指令的功能是从目的操作数中减去源操作数。

(2)带借位减SBB(Subtract with Borrow Instruction)

指令的格式:SBB  Reg/Mem, Reg/Mem/Imm

受影响的标志位:AF、CF、OF、PF、SF和ZF

指令的功能是把源操作数和标志位CF的值从目的操作数中一起减去。

(3)减1指令DEC(Decrement by 1 Instruction)

指令的格式:DEC  Reg/Mem

受影响的标志位:AF、OF、PF、SF和ZF,不影响CF

指令的功能是把操作数的值减去1。

(4)求补指令NEG(Negate Instruction)

指令的格式:NEG  Reg/Mem

受影响的标志位:AF、CF、OF、PF、SF和ZF

指令的功能:操作数=0-操作数,即改变操作数的正负号。

3、乘法指令

计算机的乘法指令分为无符号乘法指令和有符号乘法指令,它们的唯一区别就在于:数据的最高位是作为“数值”参与运算,还是作为“符号位”参与运算。

乘法指令的被乘数都是隐含操作数,乘数在指令中显式地写出来。CPU会根据乘数是8位、16位,还是32位操作数,来自动选用被乘数:AL、AX或EAX。

指令的功能是把显式操作数和隐含操作数相乘,并把乘积存入相应的寄存器中。

(1)无符号数乘法指令MUL(Unsigned Multiply Instruction)

指令的格式:MUL  Reg/Mem

受影响的标志位:CF和OF(AF、PF、SF和ZF无定义)

指令的功能是把显式操作数和隐含操作数(都作为无符号数)相乘,所得的乘积按表5.2的对应关系存放。

乘数位数 隐含的被乘数 乘积的存放位置 举例
8位 AL AX MUL  BL
16位 AX DX-AX MUL  BX
32位 EAX EDX-EAX MUL  ECX

 (2)有符号数乘法指令IMUL(Signed Integer Multiply Instruction)

 指令的格式:  

                IMUL Reg/Mem 

                IMUL Reg, Imm            ;80286+ 

                IMUL Reg, Reg, Imm   ;80286+ 

                IMUL Reg, Reg/Mem   ;80386+ 

指令格式 说明
IMUL Reg/Mem  该指令的功能是把显式操作数和隐含操作数相乘,所得的乘积按表5.2的对应关系存放。
IMUL Reg, Imm  

其寄存器必须是16位/32位通用寄存器,其计算方式为:

    Reg ← Reg × Imm

 IMUL Reg, Reg, Imm  

其寄存器只能是16位通用寄存器,其计算方式为:

    Reg1 ← Reg2×Imm  或  Reg1 ← Mem×Imm

IMUL Reg, Reg/Mem  

其寄存器必须是16位/32位通用寄存器,其计算方式为:

    Reg1 ← Reg1×Reg2  或  Reg1 ← Reg1×Mem

在指令格式2~4中,各操作数的位数要一致。如果乘积超过目标寄存器所能存储的范围,则系统将置溢出标志OF为1。

4、除法指令

除法指令的被除数是隐含操作数,除数在指令中显式地写出来。CPU会根据除数是8位、16位,还是32位,来自动选用被除数AX、DX-AX,还是EDX-EAX。

除法指令功能是用显式操作数去除隐含操作数,可得到商和余数。当除数为0,或商超出数据类型所能表示的范围时,系统会自动产生0号中断。

(1)无符号数除法指令DIV(Unsigned Divide Instruction)

指令的格式:DIV  Reg/Mem

指令的功能是用显式操作数去除隐含操作数(都作为无符号数),所得商和余数按表5.3的对应关系存放。指令对标志位的影响无定义。

(2)有符号数除法指令IDIV(Signed Integer Divide Instruction)

指令的格式:IDIV  Reg/Mem

受影响的标志位:AF、CF、OF、PF、SF和ZF

指令的功能是用显式操作数去除隐含操作数(都作为有符号数),所得商和余数的对应关系见表5.3。

除数位数 隐含的被除数 余数 举例
8位 AX AL AH DIV  BH
16位 DX-AX AX DX DIV  BX
32位 EDX-EAX EAX EDX DIV  ECX

5、类型转换指令

(1)字节转换为字指令CBW(Convent Byte to Word)

指令的格式:CBW

该指令的隐含操作数为AH和AL。其功能是用AL的符号位去填充AH,即:当AL为正数,则AH=0,否则,AH=0FFH。

指令的执行不影响任何标志位。

(2)字转换为双字指令CWD(Convent Word to Doubleword)

指令的格式:CWD

该指令的隐含操作数为DX和AX,其功能是用AX的符号位去填充DX。指令的执行不影响任何标志位。

(3)字转换为扩展的双字指令CWDE(Convent Word to Extended Doubleword)

指令的格式:CWDE        ;80386+

该指令的隐含操作数为DX和AX,其功能是用AX的符号位填充EAX的高字位。指令的执行不影响任何标志位。

(4)双字转换为四字指令CDQ(Convent Doubleword to Quadword)

指令的格式:CDQ         ;80386+

该指令的隐含操作数为EDX和EAX,指令的功能是用EAX的符号位填充EDX。指令的执行不影响任何标志位。

逻辑运算指令 

1、逻辑与操作指令AND(Logical AND Instruction)

指令的格式:AND Reg/Mem, Reg/Mem/Imm

受影响的标志位:CF(0)、OF(0)、PF、SF和ZF(AF无定义)

指令的功能是把源操作数中的每位二进制与目的操作数中的相应二进制进行逻辑“与操作”,操作结果存入目标操作数中。

2、逻辑或操作指令OR(Logical OR Instruction)

指令的格式:OR Reg/Mem, Reg/Mem/Imm

受影响的标志位:CF(0)、OF(0)、PF、SF和ZF(AF无定义)

指令的功能是把源操作数中的每位二进制与目的操作数中的相应二进制进行逻辑"或操作",操作结果存入目标操作数中。

3、逻辑非操作指令NOT(Logical NOT Instruction)

指令的格式:NOT Reg/Mem

其功能是把操作数中的每位变反,即:1←0,0←1。指令的执行不影响任何标志位。

4、逻辑异或操作指令XOR(Exclusive OR Instruction)

指令的格式:XOR Reg/Mem, Reg/Mem/Imm

受影响的标志位:CF(0)、OF(0)、PF、SF和ZF(AF无定义)

指令的功能是把源操作数中的每位二进制与目的操作数中的相应二进制进行逻辑"异或操作",操作结果存入目标操作数中。

移位操作指令 

1.算术移位指令

此组指令有:算术左移SAL(Shift Algebraic Left)和算术右移SAR(Shift Algebraic Right)。它们的指令格式如下:

SAL/SAR Reg/Mem, CL/Imm

受影响的标志位:CF、OF、PF、SF和ZF(AF无定义)。

算术左移SAL把目的操作数的低位向高位移,空出的低位补0;

算术右移SAR把目的操作数的高位向低位移,空出的高位用最高位(符号位)填补。

2、逻辑移位指令

此组指令有:逻辑左移SHL(Shift Logical Left)和逻辑右移SHR(Shift Logical Right)。它们的指令格式如下:

SHL/SHR Reg/Mem, CL/Imm

受影响的标志位:CF、OF、PF、SF和ZF(AF无定义)。

逻辑左移/右移指令只有它们的移位方向不同,移位后空出的位都补0。

3、双精度移位指令

此组指令有:双精度左移SHLD(Shift Left Double)和双精度右移SHRD(Shift Right Double)。它们都是具有三个操作数的指令,其指令的格式如下:

SHLD/SHRD  Reg/Mem, Reg, CL/Imm    ;80386+

其中:第一操作数是一个16位/32位的寄存器或存储单元;第二操作数(与前者具有相同位数)一定是寄存器;第三操作数是移动的位数,它可由CL或一个立即数来确定。

在执行SHLD指令时,第一操作数向左移n位,其“空出”的低位由第二操作数的高n位来填补,但第二操作数自己不移动、不改变。

在执行SHRD指令时,第一操作数向右移n位,其“空出”的高位由第二操作数的低n位来填补,但第二操作数自己也不移动、不改变。

SHLD和SHRD指令的移位功能示意图如图5.8所示。

受影响的标志位:CF、OF、PF、SF和ZF(AF无定义)

4、循环移位指令

循环移位指令有:循环左移ROL(Rotate Left)和循环右移ROR(Rotate Right)。

指令的格式:ROL/ROR Reg/Mem, CL/Imm

受影响的标志位:CF和OF

循环左移/右移指令只是移位方向不同,它们移出的位不仅要进入CF,而且还要填补空出的位。

5、带进位的循环移位指令

带进位的循环移位指令有:带进位的循环左移RCL(Rotate Left Through Carry)和带进位的循环右移RCR(Rotate Right)。

指令的格式:RCL/RCR Reg/Mem, CL/Imm

受影响的标志位:CF和OF

带进位的循环左移/右移指令只有移位的方向不同,它们都用原CF的值填补空出的位,移出的位再进入CF。

位操作指令 

1、位扫描指令(Bit Scan Instruction)

指令的格式:BSF/BSR Reg, Reg/Mem     ;80386+

受影响的标志位:ZF

位扫描指令是在第二个操作数中找第一个“1”的位置。如果找到,则该“1”的位置保存在第一操作数中,并置标志位ZF为1,否则,置标志位ZF为0。

根据位扫描的方向不同,指令分二种:正向扫描指令和逆向扫描指令。

(1)正向扫描指令BSF(Bit Scan Forward)从右向左扫描,即:从低位向高位扫描;

(2)逆向扫描指令BSR(Bit Scan Reverse)从左向右扫描,即:从高位向低位扫描。

2、位检测指令(Bit Test Instruction)

指令的格式:BT/BTC/BTR/BTS Reg/Mem, Reg/Imm    ;80386+

受影响的标志位:CF

位检测指令是把第一个操作数中某一位的值传送给标志位CF,具体的哪一位由指令的第二操作数来确定。

3、检测位指令TEST(Test Bits Instruction)

检测位指令是把二个操作数进行逻辑“与”操作,并根据运算结果设置相应的标志位,但并不保存该运算结果,所以,不会改变指令中的操作数。在该指令后,通常用JE、JNE、JZ和JNZ等条件转移指令。

指令的格式:TEST  Reg/Mem, Reg/Mem/Imm

受影响的标志位:CF(0)、OF(0)、PF、SF和ZF(AF无定义)

比较运算指令 

1、比较指令CMP(Compare Instruction)

指令的格式:CMP Reg/Mem, Reg/Mem/Imm

受影响的标志位:AF、CF、OF、PF、SF和ZF

指令的功能:用第二个操作数去减第一个操作数,并根据所得的差设置有关标志位,为随后的条件转移指令提供条件。但并不保存该差,所以,不会改变指令中的操作数。

2、比较交换指令(Compare And Exchange Instruction)

在数据传送类指令中,我们介绍了交换指令XCHG,它不管二个操作数的值是什么,都无条件地进行交换。而比较交换指令,是先进行比较,再根据比较的结果决定是否进行操作数的交换操作。

比较交换指令的功能:当二个操作数相等时,置标志位ZF为1;否则,把第一操作数的值赋给第二操作数,并置标志位ZF为0。

(1)8位/16位/32位比较交换指令

指令的格式:CMPXCHG Reg/Mem, AL/AX/EAX    ;80486+

受影响的标志位:AF、CF、OF、PF、SF和ZF

MASM 6.11中指令的描述与此不同,它没有限定第二操作数的要求。

(2)64位比较交换指令

该指令只有一个操作数,第二个操作数EDX:EAX是隐含的。

指令的格式:CMPXCHG8B Reg/Mem      ;Pentium+

受影响的标志位:ZF

循环指令 

1、循环指令(Loop Until Complete)

循环指令LOOP的一般格式:

LOOP 标号

LOOPW 标号      ;CX作为循环计数器,80386+

LOOPD 标号      ;ECX作为循环计数器,80386+

循环指令的功能描述:

(1)(CX)=(CX)-1或(ECX)=(ECX)-1; 

(2)如果(CX)≠0或(ECX)≠0,转向“标号”所指向的指令,否则,终止循环,执行该指令下面的指令。 

2、相等或为零循环指令(Loop While Equal or Loop While Zero)

相等或为零循环指令的一般格式:

LOOPE/LOOPZ 标号

LOOPEW/LOOPZW 标号  ;CX作为循环计数器,80386+

LOOPED/LOOPZD 标号   ;ECX作为循环计数器,80386+

这是一组有条件循环指令,它们除了要受CX或ECX的影响外,还要受标志位ZF的影响。其具体规定如下:

(1)、(CX)=(CX)-1或(ECX)=(ECX)-1; (不改变任何标志位)

(2)、如果循环计数器≠0且ZF=1,则程序转到循环体的第一条指令,否则,程序将执行该循环指令下面的指令。

3、不等或不为零循环指令(Loop While Not Equal or Loop While Not Zero)

不等或不为零循环指令的一般格式:

LOOPNE/LOOPNZ 标号

LOOPNEW/LOOPNZW 标号  ;CX作为循环计数器,80386+

LOOPNED/LOOPNZD 标号  ;ECX作为循环计数器,80386+

这也是一组有条件循环指令,它们与相等或为零循环指令在循环结束条件上有点不同。其具体规定如下:

(1)、(CX)=(CX)-1或(ECX)=(ECX)-1; (不改变任何标志位)

(2)、如果循环计数器≠0且ZF=0,则程序转到循环体的第一条指令,否则,程序将执行该循环指令下面的指令。

4、循环计数器为零转指令(Jump if CX/ECX is Zero)

在前面的各类循环指令中,不管循环计数器的初值为何,循环体至少会被执行一次。当循环计数器的初值为0时,通常的理解应是循环体被循环0次,即循环体一次也不被执行。其实不然,循环体不是不被执行,而是会被执行65536次(用CX计数)或4294967296次(几乎是死循环,用ECX计数)。

为了解决指令的执行和常规思维之间差异,指令系统又提供了一条与循环计数器有关的指令——循环计数器为零转指令。该指令一般用于循环的开始处,其指令格式如下:

JCXZ 标号   ;当CX=0时,则程序转移标号处执行

JECXZ 标号   ;当ECX=0时,则程序转移标号处执行,80386+

转移指令 

1、无条件转移指令(Transfer Unconditionally)

无条件转移指令包括:JMP、子程序的调用和返回指令、中断的调用和返回指令等。

下面只介绍无条件转移指令JMP(Unconditional Jump)。

JMP指令的一般形式:

JMP  标号/Reg/Mem

JMP指令是从程序当前执行的地方无条件转移到另一个地方执行。这种转移可以是一个短(short)转移(偏移量在[-128, 127]范围内),近(near)转移(偏移量在[-32K, 32K]范围内)或远(far)转移(在不同的代码段之间转移)。

短和近转移是段内转移,JMP指令只把目标指令位置的偏移量赋值指令指针寄存器IP,从而实现转移功能。但远转移是段间转移,JMP指令不仅会改变指令指针寄存器IP的值,而且还会改变代码段寄存器CS的值。

该转移指令的执行不影响任何标志位。

2、条件转移指令(Transfer Conditionally)

条件转移指令又分三大类:基于无符号数的条件转移指令、基于有符号数的条件转移指令和基于特殊算术标志位的条件转移指令。

(1)无符号数的条件转移指令(Jumps Based on Unsigned (Logic) Data)

指令的助忆符 检测的转移条件 功能描述
JE/JZ ZF=1 等于0则跳转
JNE/JNZ ZF=0 不等于0则跳转
JA/JNBE CF=0 and ZF=0 大于则跳转(无符号数)
JAE/JNB CF=0 大于等于则跳转(无符号数)
JB/JNAE CF=1 小于则跳转(无符号数)
JBE/JNA CF=1 or AF=1 小于等于则跳转(无符号数)

(2)有符号数的条件转移指令(Jumps Based on Signed (Arithmetic) Data)

指令的助忆符 检测的转移条件 功能描述
JE/JZ ZF=1 等于0则跳转
JNE/JNZ ZF=0 不等于0则跳转
JG/JNLE ZF=0 and SF=OF 大于则跳转(有符号数)
JGE/JNL SF=OF 大于等于则跳转(有符号数)
JL/JNGE SF≠OF 小于则跳转(有符号数)
JLE/JNG ZF=1 or SF≠OF 小于等于则跳转(有符号数)

(3)特殊算术标志位的条件转移指令(Jumps Based on Special Arithmetic Tests)

指令的助忆符 检测的转移条件 功能描述
JC CF=1 进位则跳转
JNC CF=0 无进位则跳转
JO OF=1 溢出则跳转
JNO OF=0 无溢出则跳转
JP/JPE PF=1 偶校验跳转,"1"的个数为偶数则跳转
JNP/JPO PF=0 奇校验跳转,"1"的个数为奇数则跳转
JS SF=1 符号为负则跳转
JNS SF=0 符号为正则跳转

条件设置字节指令 

条件设置字节指令(Set Byte Conditionally)是80386及其以后CPU所具有的一组指令。它们在测试条件方面与条件转移是一致的,但在功能方面,它们不是转移,而是根据测试条件的值来设置其字节操作数的内容为1或0。

条件设置字节指令的一般格式如下:

SETnn Reg/Mem    ;80386+

其中:nn是表示测试条件的(见表5.4),操作数只能是8位寄存器或一个字节单元。这组指令的执行不影响任何标志位。

表5.4 条件设置字节指令列表

指令的助忆符 操作数和检测条件之间的关系
SETZ/SETE Reg/Mem = ZF
SETNZSETNE Reg/Mem = not ZF
SETS Reg/Mem = SF
SETNS Reg/Mem = not SF
SETO Reg/Mem = OF
SETNO Reg/Mem = not OF
SETP/SETPE Reg/Mem = PF
SETNP/SETPO Reg/Mem = not PF
SETC/SETB/SETNAE Reg/Mem = CF
SETNC/SETB/SETAE Reg/Mem = not CF
SETNA/SETBE Reg/Mem = (CF or ZF)
SETA/SETNBE Reg/Mem = not (CF or ZF)
SETL/SETNGE Reg/Mem = (SF xor OF)
SETNL/SETGE Reg/Mem = not (SF xor OF)
SETLE/SETNG Reg/Mem = (SF xor OF) or ZF
SETNLE/SETG Reg/Mem = not ((SF xor OF) or ZF)

字符串操作指令 

1、取字符串数据指令(Load String Instruction)

从由指针DS:SI所指向的内存单元开始,取一个字节、字或双字进入AL、AX或EAX中,并根据标志位DF对寄存器SI作相应增减。该指令的执行不影响任何标志位。

指令的格式:LODS  地址表达式

LODSB/LODSW

LODSD          ;80386+

在指令LODS中,它会根据其地址表达式的属性来决定读取一个字节、字或双字。即:当该地址表达式的属性为字节、字或双字时,将从指针DS:SI处读一个字节到AL中,或读一个字到AX,或读一个双字到EAX中,与此同时,SI还将分别增减1,2或4。

2、置字符串数据指令(Store String Instruction)

该指令是把寄存器AL、AX或EAX中的值存于以指针ES:DI所指向内存单元为起始的一片存储单元里,并根据标志位DF对寄存器DI作相应增减。该指令不影响任何标志位。

指令的格式:STOS  地址表达式

STOSB/STOSW

STOSD      ;80386+

3、字符串传送指令(Move String Instruction)

该指令是把指针DS:SI所指向的字节、字或双字传送给指针ES:DI所指向内存单元,并根据标志位DF对寄存器DI和SI作相应增减。该指令的执行不影响任何标志位。

指令的格式:MOVS  地址表达式1, 地址表达式2

MOVSB/MOVSW

MOVSD      ;80386+

4、输入字符串指令(Input String Instruction)

该指令是从某一指定的端口接受一个字符串,并存入一片存储单元之中。输入端口由DX指定,存储单元的首地址和读入数据的个数分别由ES:DI和CX来确定。在指令的执行过程中,还根据标志位DF对寄存器DI作相应增减。该指令不影响任何标志位。

与指令有关的操作数ES、DI、DX和CX等都是隐含操作数。

指令的格式:INS  地址表达式

INSB/INSW

INSD       ;80286+

5、输出字符串指令(Output String Instruction)

该指令是把一个字符串输入到指定的输出端口中。输出端口由DX指定,其输出数据的首地址和个数分别由DS:SI和CX来确定。在指令的执行过程中,还根据标志位DF对寄存器SI作相应增减。该指令的执行不影响任何标志位。

与指令有关的操作数DS、SI、DX和CX等都是隐含操作数。

指令的格式:OUTS  地址表达式

OUTSB/OUTSW

OUTSD      ;80286+

6、字符串比较指令(Compare String Instruction)

该指令是把指针DS:SI和ES:DI所指向字节、字或双字的值相减,并用所得到的差来设置有关的标志位。与此同时,变址寄存器SI和DI也将根据标志位DF的值作相应增减。

指令的格式:CMPS 地址表达式1, 地址表达式2

CMPSB/CMPSW

CMPSD      ;80386+

受影响的标志位:AF、CF、OF、PF、SF和ZF

7、字符串扫描指令(Scan String Instruction)

该指令是用指针ES:DI所指向字节、字或双字的值与相应的AL、AX或EAX的值相减,用所得到的差来设置有关标志位。与此同时,变址寄存器DI还将根据标志位DF的值进行增减。

指令的格式:SCAS 地址表达式1

SCASB/SCASW

SCASD      ;80386+

受影响的标志位:AF、CF、OF、PF、SF和ZF

8、重复字符串操作指令(Repeat String Instruction)

前面介绍了七种不同的字符串操作指令:取字符串数据、置字符串数据、字符串传送、输入字符串、输出字符串、字符串比较和字符串扫描等指令,所叙述是这些指令执行一次所具有的功能。但我们知道:每个字符串通常会有多个字符的,所以,就需要重复执行这些字符串操作指令。为了满足这种需求,指令系统提供了一组重复前缀指令。

虽然在这些字符串指令的前面都可以添加一个重复前缀指令,但由于指令执行结果的差异,对某个具体的字符串指令又不用重复前缀指令而改用其它循环来实现重复的需要。

重复字符串操作指令对标志位的影响是由被重复的字符串操作指令来决定。

重复前缀指令REP(Repeat String Instruction)

重复前缀指令是重复其后的字符串操作指令,重复的次数由CX来决定。其一般格式为:

REP LODS/LODSB/LODSW/LODSD

REP STOS/STOSB/STOSW/STOSD

REP MOVS/MOVSB/MOVSW/MOVSD

REP INS/ INSB/INSW/INSD

REP OUTS/OUTSB/OUTSW/OUTSD

重复前缀指令的执行步骤如下:

(1)、判断:CX=0;

(2)、如果CX=0,则结束重复操作,执行程序中的下一条指令;

(3)、否则,CX=CX-1(不影响有关标志位),并执行其后的字符串操作指令,在该指令执行完后,再转到步骤(1)。

从上面的重复前缀指令格式来看,虽然我们可以使用重复取字符串数据指令(第一组指令),但可能会因为指令的执行结果而在程序中几乎不被使用。

ASCII-BCD码运算调整指令 

1、ASCII码加调整指令AAA(Ascii Adjust After Addition)

该指令是用于调整AL之值,该值是二个ASCII码字节相加之和。具体的调整规则如下:

(1)若AL的低四位大于9,或标志位AF=1,则,AH=AH+1,AL=AL+6,并置AF和CF为1,否则,只置AF和CF为0;

(2)清除AL的高四位。

指令的格式:AAA

受影响的标志位:AF和CF(OF、PF、SF和ZF等都是无定义)

2、ASCII码减调整指令AAS(Ascii Adjust After Subtraction)

该指令是用于调整AL之值,该值是二个ASCII码字节相减之差。具体的调整规则如下:

(1)若AL的低四位大于9,或标志位CF=1,则,AH=AH-1,AL=AL-6,并置AF和CF为1,否则,只置AF和CF为0;

(2)清除AL的高四位。

指令的格式:AAS

受影响的标志位:AF和CF(OF、PF、SF和ZF等都是无定义)

3、ASCII码乘调整指令AAM(Ascii Adjust After Multiplication)

该指令是用于调整寄存器AL之值,该值是由二个单BCD码字节用无符号乘指令MUL所得的积。其调整规则如下:

AH←AL/10(商),AL←AL%10(余数)

指令的格式:AAM

受影响的标志位:PF、SF和ZF(AF、CF和OF等都是无定义)

4、ASCII码除调整指令AAD(Ascii Adjust After Division)

该指令是在作除法前用于调整寄存器AH和AL之值,它是把二个寄存器中单BCD码组成一个十进制数值,为下面的除法作准备的。其调整规则如下:

AL←AH*10+AL,AH←0

指令的格式:AAD

受影响的标志位:PF、SF和ZF(AF、CF和OF等都是无定义)

5、十进制数加调整指令DAA(Decimal Adjust After Addition)

该指令是用于调整AL的值,该值是由指令ADD或ADC运算二个压缩型BCD码所得到的结果。压缩型BCD码是一个字节存放二个BCD码,低四位和高四位都是一个BCD码。

其调整规则如下:

(1)如果AL的低四位大于9,或标志位AF=1,那么,AL=AL+6,并置AF=1;

(2)如果AL的高四位大于9,或CF=1,那么,AL=AL+60H,并置CF=1;

(3)如果以上两点都不成立,则,清除标志位AF和CF。

经过调整后,AL的值仍是压缩型BCD码,即:二个压缩型BCD码相加,并进行调整后,得到的结果还是压缩型BCD码。

指令的格式:DAA

受影响的标志位:AF、CF、PF、SF和ZF(OF无定义)

6、十进制数减调整指令DAS(Decimal Adjust After Subtraction)

该指令也是用于调整AL的值,该值是由指令SUB或SBB运算二个压缩型BCD码所得到的结果。其调整规则如下:

(1)如果AL的低四位大于9,或标志位AF=1,那么,AL=AL-6,并置AF=1;

(2)如果AL的高四位大于9,或CF=1,那么,AL=AL-60H,并置CF=1;

(3)如果以上两点都不成立,则,清除标志位AF和CF。

经过调整后,AL的值仍是压缩型BCD码,即:二个压缩型BCD码相减,并进行调整后,得到的结果还是压缩型BCD码。

指令的格式:DAS

受影响的标志位:AF、CF、PF、SF和ZF(OF无定义)

处理器指令  

1、空操作指令NOP(No Operation Instruction)

该指令没有的显式操作数,主要起延迟下一条指令的执行。通常用执行指令“XCHG AX, AX”来代表它的执行。NOP指令的执行不影响任何标志位。

指令的格式:NOP

2、等待指令WAIT(Put Processor in Wait State Instruction)

该指令使CPU处于等待状态,直到协处理器(Coprocessor)完成运算,并用一个重启信号唤醒CPU为止。该指令的执行不影响任何标志位。

指令的格式:WAIT

3、暂停指令HLT(Enter Halt State Instruction)

在等待中断信号时,该指令使CPU处于暂停工作状态,CS:IP指向下一条待执行的指令。当产生了中断信号,CPU把CS和IP压栈,并转入中断处理程序。在中断处理程序执行完后,中断返回指令IRET弹出IP和CS,并唤醒CPU执行下条指令。

指令的格式:HLT

指令的执行不影响任何标志位。

4、封锁数据指令LOCK(Lock Bus Instruction)

该指令是一个前缀指令形式,在其后面跟一个具体的操作指令。LOCK指令可以保证是在其后指令执行过程中,禁止协处理器修改数据总线上的数据,起到独占总线的作用。该指令的执行不影响任何标志位。

继续阅读