167.数据传送指令
1.数据传送指令
  通用数据传送指令
      MOV、PUSH、POP、XCHG 
   累加器专用传送指令
      IN、OUT、XLAT 
   地址传送指令
      LEA、LDS、LES 
   标志寄存器传送指令
      LAHF、SAHF、PUSHF、POPF 
   类型转换指令
      CBW、CWD
2.通用数据传送指令
2.1 传送指令MOV
传送指令: MOV DST, SRC
执行操作:    (DST) ← (SRC)
注意: 
*  DST、SRC 不能同时为段寄存器       MOV  DS, ES //F
*  立即数不能直接送段寄存器          MOV  DS, 2000H //F
*  DST 不能是立即数和CS
*  DST、SRC 不能同时为存储器寻址
* 不影响标志位
2.2进栈出栈指令 PUSH POP
进栈指令: PUSH SRC
     执行操作:           (SP) ← (SP) – 2 
                                 ( (SP)+1,  (SP) ) ← (SRC)
     出栈指令:       POP  DST
     执行操作:           (DST) ← ( (SP)+1,  (SP) )                           
		      (SP) ← (SP) + 2
堆栈:‘先进后出’的存储区,段地址存放在SS中,SP在任何时候都指向栈顶,进出栈后自动修改SP。
    
 注意:   
              *  堆栈操作必须以字为单位。 
        *  不影响标志位
        *  不能用立即寻址方式          PUSH  1234H //F
        *  DST不能是CS                     POP  CS //F
例:假设 (AX) = 2107 H , 执行 PUSH AX

POP BX
 
例:     PUSH  DS
         SUB   AX, AX
         PUSH  AX
         ……
         ……
         RET
例:     PUSH  AX
         PUSH  BX
         PUSH  CX
         ……            ;其间用到AX、BX、CX
         POP    CX    ; 后进先出
         POP    BX
         POP    AX
2.3交换指令
 交换指令: XCHG OPR1, OPR2
     执行操作:   (OPR1) ↔ (OPR2)
注意:   
            *  不影响标志位
      *  不允许使用段寄存器
例:
XCHG  BX, [ BP+SI ]
             XCHG  AL, BH
3.累加器专用传送指令(只限使用AX或AL)
3.1输入指令 IN
输入指令 IN (I/O → CPU)
          
     长格式:     IN   AL, PORT   (字节)
                               IN   AX, PORT   (字)
     执行操作:(AL) ← ( PORT )                  (字节)
                                (AX) ← ( PORT+1,  PORT )(字)
      短格式:    IN   AL, DX   (字节)
                               IN   AX, DX   (字)
      执行操作:(AL) ← ( (DX) )               (字节)
                               (AX) ← ( (DX)+1,  (DX) )(字)     
3.2输出指令 OUT
输出指令 OUT (CPU → I/O)
长格式:    OUT   PORT, AL  (字节)
               OUT   PORT, AX  (字)
执行操作:( PORT ) ← (AL)                 (字节)
                 ( PORT+1, PORT ) ← (AX)(字)
短格式:    OUT   DX, AL  (字节)
                         OUT   DX, AX  (字)
执行操作:( (DX) ) ← (AL)               (字节)
                 ( (DX)+1, (DX) ) ← (AX)(字)
注意: 
* 不影响标志位
* 前256个端口号00H~FFH可直接在指令中指定(长格式)
* 如果端口号≥ 256,端口号 → DX(短格式)
例:    IN       AX, 28H                     	
          MOV   DATA_WORD, AX
例:    MOV  DX, 3FCH
          IN      AX, DX
例: OUT 5, AL
例:测试某状态寄存器(端口号27H)的第2位是否为1
               IN         AL, 27H
               TEST    AL, 00000100B
               JNZ      ERROR             ;若第2位为1,转ERROR处理
例:Sound程序
 
mov dx, 100 in al, 61h and al,11111100b sound: xor al, 2 ; 1 0 1 out 61h, al ;ON OFF ON mov cx, 140h ;脉宽 Wait1: loop wait1 dec dx jne sound
3.3换码指令 XLAT
换码指令:XLAT 或 XLAT OPR
执行操作:(AL) ← ( (BX) + (AL) )
例:MOV  BX, OFFSET TABLE   ; (BX)=0040H
        MOV  AL, 3
        XLAT  TABLE
        指令执行后 (AL)=33H

注意:
*  不影响标志位
*  字节表格(长度不超过256)
  首地址 → (BX)
*  需转换的代码位移量 → (AL)
4.地址传送指令
4.1 LEA (load effective address)有效地址送寄存器
 有效地址送寄存器指令: LEA REG, SRC(源)
     执行操作:                         (REG) ← SRC
     
LEA BX, [BX+SI+0F62H
4.2 指针送寄存器和DS、ES、ES、FS、GS、SS
指针送寄存器和DS指令: LDS REG, SRC
     执行操作:                            (REG) ← (SRC)
                                                           (DS) ← (SRC+2)
         相继二字 → 寄存器、DS
      
LDS SI, [10H]
      指针送寄存器和ES指令:  LES  REG, SRC
执行操作:                           (REG) ← (SRC)
                                                             (ES) ← (SRC+2)
         相继二字 → 寄存器、ES
LES DI, [BX]

注意: 
           *  不影响标志位
      *  REG 不能是段寄存器
*  SRC 必须为存储器寻址方式
5.标志寄存器传送指令
标志送AH指令: LAHF    (load AH with flags)
     执行操作:              (AH) ← (FLAGS的低字节)
     
     AH送标志寄存器指令:   SAHF     (store AH to flags)
     执行操作:                         (FLAGS的低字节) ← (AH)
     
     标志进栈指令:    PUSHF  (push the flags or eflags)
     执行操作:            (SP) ← (SP) - 2
                                 ( (SP)+1,  (SP) ) ← (FLAGS)
  
     标志出栈指令:    POPF  (pop the flags or eflags)
     执行操作:            (FLAGS) ← ( (SP)+1,  (SP) )
                                 (SP) ← (SP) + 2
*  影响标志位
6.类型转换指令
字节转字指令 CBW (convert byte to word)
CBW AL → AX
    执行操作: 若(AL)的最高有效位为0,则(AH)= 00H
                         若(AL)的最高有效位为1,则(AH)= FFH
字转双字 CWD(convert word to double word)
    CWD         AX → (DX,AX)
    执行操作:若(AX)的最高有效位为0,则(DX)= 0000H
                        若(AX)的最高有效位为1,则(DX)= FFFFH
     
     例:(AX) = 0BA45H
             CBW              ; (AX)=0045H
             CWD              ; (DX)=0FFFFH  (AX)=0BA45H
注意:
     *  无操作数指令
               *  隐含对AL 或AX 进行符号扩展
               *  不影响条件标志位
双字转四字 CDQ (convert double to quad)
字节交换 BSWAP (byte swap)
                    
                

                
            
        
浙公网安备 33010602011771号