汇编-数据传送类指令

数据传送类指令

  1. 通用数据传送指令
  2. 输入输出指令
  3. 地址传送指令
  4. 标志传送指令

标志传送指令外,其他指令的执行对标志位不产生影响

通用数据传送指令#

  • 一般数据传送指令

    • 使用 MOV 的注意事项
      1. 两个操作数的字长必须相同
      2. 两个操作数不允许同时为存储器操作数
      3. 两个操作数不能同时为段寄存器
      4. 在源操作数是立即数的时候 ,目标操作数不能是段寄存器
      5. IPCS 不作为目标操作数, FLAGS 一般也不作为操作数在指令中出现

    MOV [BX][BP],BX 是 错误的, 目标操作数两个都是基址,应为[][]

  • 堆栈操作指令 PUSH POP 操作数必须是 16位 的 通用寄存器 和 存储器均可,存储器需要声明字长

  • 交换指令 XCHG 操作数至少有一个是寄存器,如果是存储器操作数 必须声明字长

  • 查表转换指令 XLAT

  • 字位扩展指令

    1. 将符号数的符号位扩展到高位
    2. 指令为零操作数指令,采用隐含寻址,隐含的操作数为 AXAX,DX
    3. 无符号数的扩展规则为在高位补零
    • CBW
      • AL 的内容扩展到 AX 若最高位为 1 则执行后 AH=FFH 若最高位为 0, 则执行后 AH=00H
    • CWD
      • AX 的内容扩展到 DX AX 若最高位为 1 则执行后 DX=FFFFH 若最高位为 0, 则执行后 DX=0000H

该类所有指令的执行都不影响标志位

输入输出指令#

I/O端口:#

I/O 接口中用于存储数据、可以直接被CPU访问的寄存器

计算机输入输出系统中可以包含若干接口控制电路(芯片),每个接口都包含了一个或者多个端口

输入输出指令#

专门面向 I/O 端口操作的指令

端口地址在指令中的表示方式 寻址方式

指令功能: 从端口地址读入数据到累加器/将累加器的值输出到端口中

指令格式:

  1. 输入指令: IN acc,PORTPORT是端口地址, accAL/AX
  2. 输出指令: OUT PORT,acc

指令寻址方式#

  • 根据端口地址码的长度,指令具有两种不同的端口地址表现形式

  • 直接寻址

    • 端口地址为 8位 时,指令中直接给出 8位 端口地址
    • 寻址 256个 端口
  • 间接寻址

    • 端口地址为 16位 指令中的端口地址必须由DX 指定
    • 可寻址 64K 个端口

地址传送指令#

  • 取偏移地址指令 LEA 取近地址指针
  • LDS 指令 取远地址指针
  • LES 指令 取远地址指针

LEA#

操作#

将变量的 16位 偏移地址写入到目标寄存器

当程序中用符号标志内存偏移地址的时,须使用该指令#

格式#

LEA REG,MEM

指令要求#

源操作数 必须是一个 存储器操作数,目标操作数通常是间址寄存器

LDS LES指令#

LDS 和 LES 均用于将一个 32位的远地址指针写入到目标寄存器#

LDS 的一般格式#

LDS 通用寄存器,存储操作数

将源操作数的偏移地址送到目标寄存器,将源操作数的段地址送到 ES

因此这个存储器操作数事实上是一个 32位 的操作数

LES 的一般格式#

LES 通用寄存器,存储操作数

将源操作数的偏移地址送到目标寄存器,将原操作数的段地址送到 ES

标志传送指令#

LAHF SAHF#

隐含操作数 AH

LAHF :FLAGS 的低八位装入 AH

SAHF :AH 的内容写入 FLAGS 的低八位

PUSHF POPF#

隐含操作数 FLAGS

能够表示偏移地址的寄存器只有四个 BX BP SI DI

posted @   ccz9729  阅读(499)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示
主题色彩