汇编常用指令

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作为被除数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值