• 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)

     

     

     

     

  • 相关阅读:
    javascript中的常用表单事件用法
    关于js键盘事件的例子
    对象间引用赋值及方法时引用传递
    反编译工具reflector破解方法
    使用委托(C# 编程指南)
    委托(C# 编程指南)
    浅谈线程池(下):相关试验及注意事项
    Lambda 表达式(C# 编程指南)
    浅谈线程池(中):独立线程池的作用及IO线程池
    浅谈线程池(上):线程池的作用及CLR线程池
  • 原文地址:https://www.cnblogs.com/ZanderZhao/p/11050348.html
Copyright © 2020-2023  润新知