80x86指令系统

                3.3     80x86指令系统
3.3 .1    数据传送指令

1.通用传送指令
(1)MOV 指令
格式: MOV  DST,SRC
功能:将源操作数SRC的内容送到目的操作数DST中去。
(2)MOVSX带符号扩展传送指令(386以后)
格式: MOVSX DST,SRC
功能:  (DST)符合扩展(SRC)
(3)MOVZX带零扩展传送指令(386以后)
格式: MOVZX DST,SRC
功能:  (DST)零扩展(SRC)
例3.25  MOVZX DX,  AL;816
例3.26  MOVZX EAX,  DATA;1632
(4)PUSH进栈指令
格式: PUSH  SRC
功能:16位指令:(SP)←(SP)—2
                ((SP)+1,(SP))← (SRC)
      32位指令:(ESP)←(ESP)—4
      ((ESP)+3,(ESP)+2,(ESP)+1,(ESP))(SRC)
(5)POP出栈指令
格式: POP  DST
功能:16位指令:(DST)← ((SP)+1,(SP))
                (SP)←(SP)+2
32位指令:(DST)((ESP)+3,(ESP)+2,(ESP)+1,(ESP))          (ESP)(ESP)+4
(6)PUSHA/PUSHAD 所有寄存器进栈指令(286以后)
PUSHA:16位进栈次序AX,CX,DX,BX,指令执行前的SP,BP,SI,DI。执行后(SP)(SP)—16。
PUSHAD:32位进栈次序EAX,ECX,EDX,EBX,指令执行前的ESP,EBP,ESI,EDI。执行后(ESP)(ESP)—32。
(7)POPA/POPAD 所有寄存器出栈指令(286以后)
POPA:16位出栈次序:DI,SI,BP,SP,BX,DX,CX,AX。       
执行后(SP)(SP)+16。
POPAD:32位出栈次序:DI,SI,BP,SP,BX,DX,CX,AX。执行后(ESP)(ESP)+16。
(8)XCHG指令
格式: XCHG  OPR1,OPR2
功能:完成OPR1操作数与OPR2操作数内容的交换。
不允许使用段寄存器和立即数。
例  XCHG  BX,[BP+SI]
执行前 (BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246H)=4154H
执行后 (BX)=4154H,(2F246H)=6F30H
2.累加器专用传送指令
(1) IN输入指令
长格式: IN AL,PORT(字节);(AL)(PORT)
   IN AX,PORT(字);(AX)(PORT+1,PORT)
   IN EAX,PORT(双字);(EAX)(PORT+3…)
短格式: IN AL,(DX)(字节);(AL)(DX)
   IN AX,(DX)(字);(AX)(DX+1,DX)
   IN EAX,(DX)(双字);(EAX)(DX+3…)
(2) OUT输出指令
长格式: OUT PORT,AL(字节);(PORT)(AL)
   OUT PORT,AX(字);(PORT+1,PORT)(AX)
   OUT PORT,EAX(双字);(PORT+3…)(EAX)
例 IN AX,28H
   MOV DATA-WORD,AX
例 MOV DX,3FCH
   IN  EAX,DX
例 OUT 5,AL
(3)XLAT 换码指令
格式:XLAT
功能:将AL与BX寄存器内容之和为偏移地址的存储单元内容送AL。
     (AL)← ((BX)+(AL));16位
  (AL)← ((EBX)+(AL));32位
例3.39 如(BX)=0040H,(AL)=0FH,(DS)=F000H,
(F004FH)=2CH
指令执行后  (AL)=2CH

3.地址传送指令
(1)LEA 指令
格式:LEA  REG,SRC;(REG)SRC
功能:把源操作数的有效地址送到指定寄存器中。
例3.40  LEA BX, [BX+SI+0F62H]
如执行前(BX)=0400H,(SI)=003CH
指令执行后  (BX)=0040+003C+0F62=139EH
例3.41  LEA BX, LIST
   MOV BX, OFFSET LIST
(2)LDS、LES、LFS、LGS和LSS指针送寄存器和段寄存器。
•LDS 指令
格式:LDS  REG,SRC;(REG)(SRC)
                    (DS)(SRC+2)
功能:将SRC存储单元存放的4个字节送指定的寄存器和DS寄存器。
例3.42  LDS DI,[BX]
如执行前(DS)=B000H,(BX)=080AH,(0B080AH)=05AEH,
        (0B080CH)=4000H
指令执行后  (DI)=05AEH,(DS)=4000H

4.标志寄存器传送指令
(1)LAHF标志送AH指令
格式: LAHF
功能:将标志寄存器的最右8位送AH寄存器。
(2) SAHF  AH送标志寄存器指令
格式: SAHF
功能:将AH寄存器内容送标志寄存器的最右8位。
(3) PUSHF/PUSHFD 标志进栈指令
功能:
PUSHF:(SP)←(SP)—2
  ((SP)+1,(SP))←(FLAGS)
PUSHFD:(ESP)(ESP)—4
  ((ESP)+3,(ESP)+2,(ESP)+1,(ESP))(FLAGS AND 0FCFFFFH)

(4) POPF/POPFD 标志出栈指令
功能:
PUSHF:(FLAGS)←((SP)+1,(SP))
(SP)←(SP)+2
PUSHFD:(FLAGS)((ESP)+3,(ESP)+2,(ESP)+1,(ESP))
(ESP)(ESP)+4

5. 类型转换指令
     (1)CBW  字节转换为字指令
格式: CBW
功能:将AL的符号位扩充到AH中。
    即若AL的符号位为0,则AH=00H
   若AL的符号位为1,则AH=0FFH
     (2)CWD/CWDE  字转换为双字指令
格式: CWD
功能:将AX的符号位扩充到DX中。
即若AX的符号位为0,则DX=0000H
  若AX的符号位为1,则DX=0FFFFH
格式:CWDE(386以后)
功能:将AX的符号位扩充到EAX中,形成EAX的双字。
    (3)CDQ  双字转换为4字节指令
格式:CDQ(386以后)
功能:将EAX的符号位扩充到EDX中,形成EDX:EAX的4字节。
(4)BSWAP 字节交换指令(386以后)
格式:BSWAP r32
功能:指令指定的32位寄存器的字节次序变反。
例3.44  BSWAP  EAX
执行前  (EAX)=11223344H
执行后  (EAX)=44332211H

1. 与REP相匹配的指令

(1)重复操作前缀
格式:REP  <串操作指令>
功能:1)  若CX=0 则退出REP操作,否则转2)执行
      2)  CX←CX—1
      3)  执行REP 后面的<串操作指令>一次
4)   转回 1) 执行

说明:1)CLD 清除方向标志指令
         格式:CLD
         功能:DF←0,可使地址自动增加。
       2)STD 设置方向标志指令
         格式:STD
         功能:DF←1,可使地址自动减少。

(2)MOVS 串传送指令
格式1:MOVSB          ;字节操作
功能1: ES:(DI)←DS:(SI) ,
SI←SI ± 1  DI←DI ± 1
格式2:MOVSW          ;字操作
功能2:ES:(DI)←DS:(SI) ,
SI←SI ± 2  DI←DI ± 2

例3.70  LEA  SI,MESS1
    LEA  DI,MESS2
    MOV  CX,17
    CLD
    REP  MOVSB
(3)STOS 存入串指令
格式1:STOSB          ;字节操作
功能1:(DI)← AL  ,  DI←DI ± 1
格式2:STOSW          ;字操作
功能2:(DI) ←AX  ,  DI←DI ± 2
例3.71   MOV  AL,20H
    LEA  DI,MES
    MOV  CX,5
    CLD
    REP  STOSB

(4)LODS 串读取指令
格式1:LODSB          ;字节操作
功能1:AL← (SI)    SI←SI ± 1
格式2:LODSW          ;字操作
功能2:AX← (SI)    SI←SI ± 2

2.与REPE/REPZ和REPNE/REPNZ相匹配的指令

(1)REPE/REPZ 相等(为0)时重复操作前缀
格式:REPE/RPEZ  <串操作指令>
功能:1)  若(CX)=0或ZF=0 则退出REPE/REPZ操作,
          否则转2)执行
      2)  (CX)← (CX)—1
3)  执行其后的串指令
4)  重复 1)~3)

(2)REPNE/REPNZ不相等(不为0)时重复操作前缀
格式:REPNE/RPENZ<串操作指令>
功能:1)  若(CX)=0或ZF=1 则退出REPNE/REPNZ操作,否则转2)执行
      2)  (CX) ←(CX)—1
    3)  执行其后的串指令
4)  转回 1) 执行

使用注意:
1) 源串地址指针用SI,目的串地址指针用DI。
   若使用重复前缀REP,要把串的长度存入CX寄存器中。
2) 根据实际情况确定合适的DF值,
     增址方式置DF=0, 减址方式置DF=1。
3) 源串在数据段中,目的串在附加段中。
     也可采用变通方式,即把源串和目的串定义在一个物理段内,把这个物理段定义为既是数据段,也是附加段。

(3)CMPS 串比较指令

格式1:CMPSB          ;字节操作
功能1:(DI)—(SI) , SI←SI ± 1 , DI←DI ± 1
格式2:CMPSW          ;字操作
功能2:(DI)—(SI) , SI←SI ± 2 , DI←DI ± 2

2)SCAS 串扫描指令
格式1:SCASB          ;字节操作
功能1:AL—(DI)  ,  DI←DI ± 1
格式2:SCASW          ;字操作
功能2:AX—(DI)  ,  DI←DI ± 2

例3.72   MOV  AL,20H
    LEA  DI,MES ;(DI)=1500H,P83
    MOV  CX,11H
    CLD
    REPNZ  SCASB ;(CX)=8,(DI)=1509H
例3.73   LEA  SI,MES1;1500H 
    LEA  DI,MES2;0200H
    MOV  CX,11H
    CLD
    REPE CMPSB
;(SI)=1505H,(DI)=0205H,(CX)=0CH,ZF=0。见P84

3.3.5 处理机控制指令与杂项操作指令
1. 标志处理指令
•CLC   进位位置0指令    CF←0
•CMC  进位位置0指令    CF←/CF
•STC   进位位置1指令    CF←1
•CLD   方向标志置0指令  DF←0
•STD   方向标志置1指令  DF←1
•CLI  中断标志置0指令   IF←0
•STI  中断标志置I指令   IF←1

2.其他处理机控制指令与杂项操作指令
•NOP  空操作指令
该指令不执行任何操作
•HLT  停机指令;CPU暂停工作
3.2.3  逻辑运算指令

1.逻辑运算指令

(1)AND 逻辑与指令
指令格式: AND  DST,SRC;(DST)←(DST)∧(SRC)
指令功能:将源操作数与目标操作数按位进行逻辑“与”运算,且将结果送入目标操作数。

(2)OR 逻辑或指令
指令格式: OR  DST,SRC;(DST)←(DST)∨(SRC)
指令功能:将源操作数与目标操作数按位进行逻辑“或”运算,且将结果送入目标操作数。

(3)NOT 逻辑非指令
指令格式: NOT  OPR;(OPR)← /(OPR)
指令功能:将给定的操作数按位求反。

(4)XOR 逻辑异或指令
指令格式: XOR  DST,SRC;(DST)←(DST)⊕(SRC)
指令功能:将源操作数与目标操作数按位进行逻辑“异或”运算,且将结果送入目标操作数。

(5)TEST 测试指令
指令格式: TEST  OPR1,OPR2;(OPR1)∧(OPR2)
指令功能:将两个操作数按位进行逻辑“与”运算,但不保存结果,只根据特征设置状态位。

例3.57  MOV AL,0BFH
   AND AL,0FCH   ;屏蔽0、1位。
例3.58  MOV AL,43H
   OR  AL,20H   ;第5位置1。
例3.59  MOV AL,40H
   TEST AL,0AFH
           ;测试第0,1,2,3,5,7为0,ZF=1
例3.60  MOV DL,AL
  NOT DL
   TEST DL,00000100B
           ;测试AL第2位的值是否为1。
例3.61  MOV AL,11H
XOR 3           ;第0,1位变反。
例3.62  XOR AX,042EH
           ;测试AX=042EH?如ZF=1则 相等。

4.移位指令

(1)移位指令

1) SHL 逻辑左移指令
指令格式:  SHL  OPR,CNT
指令功能:把指定的操作数左移CNT位,每次最高位移入进位位CF,空出的最低位补0。8086 CPU CNT可以是1或CL。

2)SAL 算术左移指令
指令格式:  SAL  OPR,CNT
指令功能: 与SHL指令完全相同。

3)SHR 逻辑右移指令
指令格式:  SHR  OPR,CNT
指令功能:把指定的操作数右移CNT位,每次最低位移入进位位CF,空出的最高位补0。

4)SAR 算术右移指令
指令格式:  SAR  OPR,CNT
指令功能:把指定的操作数右移CNT位,每次最低位移入进位位CF,空出的最高位保持它原来的值。

(2)循环移位指令

1)ROL 循环左移指令
指令格式:  ROL  OPR,CNT
指令功能:把指定的操作数左环移CNT位,每次最高位移入进位位CF,其他位顺序左移一位,空出的最低位由原来的最高位填入。

2)ROR 循环右移指令
指令格式:  ROR  OPR,CNT
指令功能:把指定的操作数右环移CNT位,每次最低位移入进位位CF,其他位顺序右移一位,空出的最高位由原来的最低位填入。

3)RCL 带进位循环左移指令
指令格式:  RCL  OPR,CNT
指令功能:把指定的操作数连同进位位一起左环移CNT位,每次移位,CF移入操作数的最低位,操作数的最高位移入CF,其他位顺序左移一位。

4)RCR 带进位循环右移指令
指令格式:  RCR  OPR,CNT
指令功能:把指定的操作数连同进位位一起右环移CNT位,每次移位,CF移入操作数的最高位,操作数的最低位移入CF,其他位顺序右移一位。

例3.65  MOV CL,5
   SAR [DI],CL
执行前  (DS)=0F800H,(DI)=180AH,
(0F980AH)=0064H
执行后  (0F980AH)=0003H,CF=0;100/32=3
例3.66   MOV CL,2
      SHL SI,CL
执行前  (SI)=1450H
执行后  (SI)=5140H,CF=0;5200 *4=20800
例3.67  MOV CL,8
   ROL AX,CL
   ADD AX,BX
执行前  (AX)=0012H,(BX)=0034H
执行后  (AX)=1234H
3.3.2  算 术 指 令
1. 加法指令
   (1)ADD加法指令
格式:ADD  DST,SRC;(DST)←(SRC)+(DST)
功能:将源操作数和目标操作数作为两个二进制数相加,
      并将结果送入目标操作数。
   (2)ADC带进位加法指令
格式:ADC  DST,SRC;(DST)←(SRC)+(DST)+CF
功能:将源操作数、目标操作数和进位标志CF的值相加后送目标操作数。
   (3)INC加1指令
格式:INC  OPR; (OPR)←(OPR)+1
功能:将除段寄存器以外任何寄存器或存储单元内容加1。
例3.45  ADD DX,0F0F0H
执行前  (DX)=4652H
执行后  (DX)=3742H,ZF=0,SF=0,CF=1,OF=0
例3.46  ADD AX,CX
   ADC DX,BX
执行前  (DX)=0002H,(AX)=0F365H,
(BX)=0005H, (CX)=0E024H
执行后  (DX)=0008H,(AX)=0D389H
2. 减法指令
    (1)SUB减法指令
格式:SUB  DST,SRC;(DST)←(DST)—(SRC)
功能:从目标操作数中减去源操作数,并将结果存入目标操作数。
    (2)SBB带借位的减法指令
格式:SBB  DST,SRC;(DST)←(DST)—(SRC)—CF
功能:从目标操作数中减去源操作数,再减去借位CF,并把结果存入目标操作数。
    (3)DEC  减1指令; (OPR)←(OPR)—1
格式:DEC   OPR
功能:将目标操作数减1。

   (4)NEG 求补指令
格式:NEG  OPR;(OPR)←10000H—(OPR);16位
功能:使操作数按位求反再加1,结果送入目标操作数。

    (5)CMP 比较指令
格式:CMP  OPR1,OPR2;(OPR1)—(OPR2)
功能:用目标操作数减去源操作数,但并不将结果送回目标操作数,只是根据结果设置标志位。
例3.48  SUB [SI+14H],0136H
执行前  (DS)=3000H,(SI)=0040H,
(30054H)=4336H,
执行后  (30054H)=4200H,SF=0,ZF=0,CF=0,OF=0
例3.49  SUB DH,[BP+4]
执行前  (DH)=41H,(SS)=0000H,(BP)=00E4H,
           (000E8H)=5AH
执行后  (DH)=0E7H,SF=1,ZF=0,CF=1,OF=0
例3.50  W←X+Y+24—Z;32位用16位指令完成
   MOV AX,X
   MOV DX,X+2
   ADD AX,Y
   ADC DX,Y+2
   ADD AX,24
   ADC DX,0
   SUB AX,Z
   SBB DX,Z+2
   MOV W,AX
   MOV W+2,DX
3. 乘法指令
    (1)MUL无符号数相乘指令
格式:MUL  SRC;字节:(AX)←(AL)*(SRC)
      字:(DX,AX)←(AX)*(SRC)
功能:将累加器(AX或AL)与源操作数作为无符号数相乘。
   字节运算:AL×SRC  结果存放在AX 中。
   字运算:AX×SRC  结果存放在DXAX 中。

    (2)IMUL带符号数乘法指令
格式:IMUL  SRC
功能:将累加器(AX或AL)与源操作数作为带符号数相乘。
         字节运算:AL×SRC  结果存放在AX 中。
         字运算:AX×SRC  结果存放在DXAX 中。
例3.52  如  (AL)=0B4H,(BL)=11H
MUL BL  结果(AX)=0BF4H=3060D,CF=OF=1
IMUL BL  结果(AX)=0FAF4H= —1292D,CF=OF=1
4. 除法指令
     (1)DIV   无符号数除法指令
格式:DIV  SRC;
字节:(AL)←(AX)/(SRC)的商
    (AH)←(AX)/(SRC)的余数
字:(AX)←(DX,AX)/(SRC)的商
  (DX)←(DX,AX)/(SRC)的余数
功能:将两个无符号数相除。
  字节运算:AX÷SRC  结果商在AL 中,余数在AH中。
  字运算:DXAX÷SRC  结果商在AX 中,余数在DX中。
    (2)IDIV   带符号数除法指令
格式:IDIV  SRC
功能:将两个带符号数相除。
例3.55  如  (AX)=0400H,(BL)=0B4H
DIV BL
;结果 商(AL)=05,余数(AH)=7CH=124D
IMUL BL
;结果 商(AL)=0F3= —13,余数(AH)=24H=36D
例3.56
3.2.3十进制算术运算指令
1. 压缩的BCD码调整指令
•DAA  加法的十进制调整指令
格式:DAA
功能:在两个压缩的BCD码相加后使用,隐含AL为目标操作数。
     MOV  AL,17H
     ADD  AL,18H
     DAA
•DAS  减法的十进制调整指令
格式:DAS
功能:在两个压缩的BCD码相减后使用,隐含AL为目标操作数。
2. 非压缩的BCD码调整指令
•AAA  加法的ASCII码调整指令
格式:AAA
功能:在两个非压缩的BCD码相加后使用,隐含AL为目标操作数。
•AAS  减法的ASCII调整指令
格式:AAS
功能:在两个非压缩的BCD码相减后使用,隐含AL为目标操作数。
•AAM  乘法的ASCII码调整指令
格式:AAM
功能:在两个非压缩的BCD码相乘后使用,隐含源操作数为AL,目标操作数为AX。
•AAD  除法的ASCII码调整指令
格式:AAD
功能:将AX中的非压缩的BCD码调整成二进制,送入AL作为被除数。

你可能感兴趣的:(测试,存储,扩展,div,DST,X86)