位操作指令
1. 逻辑指令
一般形式:
 AND dest, src  ; dest = dest and src
 OR dest, src  ; dest = dest or src
 XOR dest, src  ; dest = dest xor src
 NOT dest  ; dest = not dest
 TEST dest, src  ; dest and src,执行AND操作但不存储结果到dest
语法格式:
         AND   reg/mem, reg/mem/imm
         OR   reg/mem, reg/mem/imm
         XOR   reg/mem, reg/mem/imm
         NOT     reg/mem
    TEST   reg/mem, reg/mem/imm 
对标志位的影响:
     NOT:无。
    其它指令:CF = OF = 0,按一般规则影响SF和ZF。
1. 移位指令
?移位指令包括:
        SHL(Shift Left):逻辑左移
        SAL(Shift Arithmetic Left):算术左移
        SHR (Shift Right):逻辑右移
        SAR(Shift Arithmetic Right):算术右移
其中,SHL与SAL完全相同,只是同一指令的不同助记符而已。
一般形式:
 SHL dest, count  ; dest左移。其中,count为移位次数(下同)
         SAL dest, count  ; 同SHL
         SHR     dest, count  ; dest逻辑右移
        SAR     dest, count  ; dest算术右移
语法格式:
         SHL reg/mem, 1/CL 
       SHL reg/mem, imm8 ; 286新增
         SAL、SHR与SAR格式同SHL
功能描述:
    SHL/SAL:左移。最高位移出到CF,最低位移入0。
    SAR:算术右移。最低位移入CF,最高位不变。
    SHR:逻辑右移。最低位移入CF,最高位移入0。
对标志位的影响:
      若移位后符号位发生了变化,则OF = 1,否则OF = 0;CF为最后移入位;按一般规则影响ZF与SF。然而,若移位次数为0,则不影响标志位;若移位次数 > 1,则OF无定义。
【例】设AX的值为一个2字节非压缩BCD码,将其转换为1字节压缩BCD码存入AL。
 mov cl, 4
 shl ah, cl ; ah低4位移到高4位
         and al, 0fh       ; al高4位清0
         or      al, ah        
2.循环移位
循环移位指令包括:
      ROL(Rotate Left):循环左移
      ROR(Rotate Right):循环右移
      RCL(Rotate through Carry Left):带进位循环左移
      RCR(Rotate through Carry Right):带进位循环右移
一般形式:
         ROL    dest, count  ; dest循环左移。其中,count为移位次数(下同)
         ROR    dest, count  ; dest循环右移
         RCL dest, count  ; dest带CF循环左移
         RCR dest, count  ; dest带CF循环右移
语法格式:
        ROL reg/mem, 1/CL
 ROL reg/mem, imm8  ; 286新增
        ROR、RCL、RCR格式同ROL
功能描述:
    ROL:循环左移。最高位移出到CF,并同时移入最低位。
    RCL:带进位循环左移。最高位移出到CF,原CF移入最低位。
    ROR:循环右移。最低位移出到CF,并同时移入最高位。
    RCR:带进位循环右移。最低位移出到CF,原CF移入最高位。
对标志位的影响:
      若移位后符号位发生了变化,则OF = 1,否则OF = 0;CF为最后移入位;不影响ZF与SF。然而,若移位次数为0,则不影响标志位;若移位次数 > 1,则OF无定义。
【例】将DX:AX中的32位数左移1位。
 shl ax, 1
 rcl dx, 1
3. 位测试指令
?位测试指令包括;
       BT(Bit Test):位测试
       BTS(Bit Test and Set):位测试并置位
       BTR(Bit Test and Reset):位测试并复位
       BTC(Bit Test and Complement):位测试并取反)
这些指令均为386新增指令。
一般形式:
 BT dest, index  ; CF = dest的第index位,dest不变 
 BTS dest, index  ; CF = dest的第index位,dest的第index位 = 1
 BTR dest, index  ; CF = dest的第index位,dest的第index位 = 0
 BTC dest, index  ; CF = dest的第index位,dest的第index位取反
 语法格式:
         BT reg16/mem16, reg16/imm8
         BT reg32/mem32, reg32/imm8
         BTR、BTS、BTC格式同BT
对标志位的影响:影响CF;其余标志无定义。
【例】位测试。
 bt eax, 12 ; CF = eax的第12位
 bts eax, 12 ; CF = eax的第12位,eax的第12位 = 1
 btr eax, 12 ; CF = eax的第12位,eax的第12位 = 0
 btc eax, 12 ; CF = eax的第12位,eax的第12位取反
 
控制转移指令
语法格式:
 JMP   label ; 若label与该指令位于同一代码段:IP = label的偏移地址;
   ; 若label与该指令不在同一代码段:CS:IP = label的分段地址
 JMP   reg16/mem16 ; IP = reg16 / [mem16]
 JMP   mem32 ; CS = [mem32+2],IP = [mem32]
功能描述:
 JMP    label       ; 段内/段间直接转移
         ; 目标地址:标号label处
 JMP reg16/mem16 ; 段内间接转移
         ; 目标地址:同一代码段,偏移地址 = reg16 / [mem16]
 JMP mem32       ; 段间间接转移
         ; 目标地址:段地址= mem32高字,偏移地址= mem32低字
对标志位的影响:无。
2. 条件转移指令
?为简化描述,用Jcc表示所有条件转移指令的助记符。
一般形式:
 Jcc   label ; 若条件成立,则IP = label的偏移地址。其中,label是标号
功能描述:若条件成立,则转移到目标地址label;否则,CPU忽略该条件转移,继续执行下一条指令。
对标志位的影响:无。
Jcc指令包括下列3类:
(1)测试单个标志位的Jcc指令。
(2)用于带符号数比较的Jcc指令。常用在CMP指令之后,以判断带符号数的大小。
(3)用于无符号数比较的Jcc指令。常用在CMP指令之后,以判断无符号数的大小。
3. JCXZ/JECXZ(Jump if CX/ECX is Zero)
?语法格式:
 JCXZ label ; 若CX = 0,则转移到label
 JECXZ label ; 若ECX = 0,则转移到label;386新增
对标志位的影响:无
说明:
     label相对位移量必须在-128 ~ 127之间,所有80x86 CPU都一样。
4. 循环指令
循环指令包括:
      LOOP
      LOOPE/LOOPZ(Loop while Equal/Zero)
      LOOPNE/LOOPNZ(Loop while Not Equal/Not Zero)
LOOPZ与LOOPE、LOOPNZ与LOOPNE完全等价,只是同一指令的不同助记符。
语法格式:
 LOOP  label ; CX = CX – 1,若CX<>0,则转移到label
 LOOPZ/LOOPE label ; CX = CX – 1,若CX<>0且ZF=1,则转移到label
 LOOPNZ/LOOPNE label ; CX = CX – 1,若CX<>0且ZF=0,则转移到label
对标志位的影响:无。
5. 中断指令INT
      本章只简单引入软件中断调用指令INT。详细介绍参见第8章。
      语法格式:
 INT n ; 调用中断n的中断服务程序。n 为中断号,取值0 ~ 255。
      对标志位的影响:不影响CF、OF、SF、ZF。
      MS DOS使用中断号21H作为系统调用,为程序员提供了上百种系统服务功能,对这些功能的调用步骤如下:
    (1)由AH给出功能号。
    (2)根据相应功能的要求,设置入口参数。
    (3)INT 21H。
    (4)分析和使用出口参数。
      其中,最常用的是功能号4CH,用来实现程序退出、并返回DOS。使用方法如下:
 mov ah, 4ch 
 int    21h
标志处理指令     
标志处理指令包括CLC(Clear Carry Flag,CF清0)、STC(Set Carry Flag,CF置1)、CMC(Complement Carry Flag,CF取反)、CLD(Clear Direction Flag,DF清0)、STD(Set Direction Flag,DF置1)、CLI(Clear Interrupt Flag,关中断)和STI(Set Interrupt Flag,开中断)。
        语法格式:
 CLC ; CF = 0
 STC ; CF = 1
 CMC ; CF = NOT CF
 CLD ; DF = 0
 STD ; DF = 1
 CLI ; IF = 0
 STI ; IF = 1
        对标志位的影响:只影响指定标志。
       注意,在程序中应慎重使用CLI指令,错误的使用会导致系统无法正常工作。

处理器控制指令
1.NOP(No Operation):无操作
语法格式:
 NOP
功能描述:NOP指令不做任何事情,只占用1个字节,耗费1个指令执行周期。
说明:
      程序员经常使用NOP作为占位符(Place Holder),以预留内存空间。当然,可以使用其它指令实现类似功能,如XCHG AX, AX 指令。事实上,NOP与XCHG AX, AX 的机器码完全一样,都是90H。
对标志位的影响:无。
?2.HLT(Halt):暂停
语法格式:
 HLT
功能描述:
        使CPU进入暂停状态,这时CPU不执行任何操作,直到系统复位或发生外部中断为止。中断使CPU继续执行HLT后的下一条指令。
说明:
        HLT不能用来终止程序。通常,应用程序不使用该指令。
对标志位的影响:无。