8086指令系统 通用数据传送指令

Posted _DiMinisH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8086指令系统 通用数据传送指令相关的知识,希望对你有一定的参考价值。

通用数据传送指令

指令作用
MOV dest,srcsrc -> dest
PUSH src(16位)src 内容入栈
POP dest(16位)栈顶2个单元内容复制到dest中
XCHG dest,src交换 dest 和 src 中的数据
XLAT表的首地址(偏移地址)放到 BX , 将要查找的元素序号放到 AL 中, 执行XLAT指令后, 表中相应序号的元素被存入 AL 中
LEA REG, 符号变量将符号变量所对应的内存偏移地址复制到 REG 中
MOV REG, OFFSET 符号变量LEA REG, 符号变量
MOV REG, SEG 符号变量将SEGMENT的段地址复制到REG
LDS REG, SEGMENT:[偏移地址]指定段的偏移地址位置的两个单元内容复制到REG,+2两个单元的内容复制到DS
LES REG, SEGMENT:[偏移地址]指定段的偏移地址位置的两个单元内容复制到REG,+2两个单元的内容复制到ES
CBWAL数据的最高位扩展到AH
CDWAX数据的最高位扩展到DX
PUSHF将FLAGS寄存器中的内容入栈
POPF将栈顶的内容(栈顶两个单元的内容)复制到FLAGS寄存器中
LAHF将FLAGS寄存器的低8位内容复制到AH寄存器中
SLAHF将AH寄存器的内容复制到FLAGS寄存器中

1. MOV指令

MOV 目标操作数, 源操作数

功能:
  将一个操作数从源地址复制到目标地址。

注意:
  (1). 两个操作数必须是相等字长的;
  (2). 两个操作数不能同时是存储器操作数, 既不能实现内存中的单元复制到另一块内存中的单元;
  (3). 两个操作数不能同时是段寄存器;
  (4). 指令指针存储器IP 和 代码段寄存器CS 不能作为目标操作数;
  (5). 寄存器FLAGS不能作为操作数;
  (6). 源操作数是立即数, 目标操作数不能是段寄存器。

2. 入栈指令

堆栈:
  堆栈是内存中一个特定的区域, 用于存放寄存器或存储器中暂时不用又必须保存的数据, 在内存中, 堆栈所处的段叫堆栈段, 其段地址在SS寄存器中。对堆栈的操作满足先进先出。
堆栈的作用:
  交换两个数、签到计数器 等

入栈指令

PUSH 存储器操作数/寄存器

功能:
  将内存中的数据或寄存器中的数据放入堆栈。

注意:
  (1). 堆栈入栈以字节为单位, 每次2字节, 存储器必须是16位的;
  (2). 在堆栈中存放数据, 从高地址向低地址存放;
  (2). 堆栈段的内存由SS决定, 寄存器SP中存放着栈顶的偏移地址。

执行 PUSH AX 指令 步骤:
① SP = SP -2
② 将数据拷贝到栈中
  高8位复制到 SP + 1
  低8位复制到 SP


3. 出栈指令

出栈指令

POP 存储器操作数/寄存器

功能:
  将当前栈顶元素数据复制到内存中或寄存器中。

注意:
  出栈时, 寄存器不能为CS

执行 POP AX 指令 步骤:
① 将数据拷贝到栈中
  SP 数据复制到 低八位
  SP + 1 数据复制到 高8位复制到 SP
② SP = SP + 2

4. 交换指令

XCHG 目标操作数, 源操作数

注意:
  (1). 两个操作数不能同时为存储器操作数
  (2). 两个操作数不能是段寄存器
  (3). 两个操作数字长必须相同

4. 查找表指令

XLAT

功能:
  根据查找表中的元素序号找出相应的元素

使用:
  将查找表写好放到内存中, 将表的首地址(偏移地址)放到 寄存器BX , 将要查找的元素序号放到 寄存器AL 中(表中第一个元素序号为0), 执行XLAT指令后, 表中相应序号的元素被存入 寄存器AL中。

例子:

LEA SI, TABLE ;将TABLE(查找表)的偏移地址放到SI寄存器中
MOV BX, TABLE
MOV AL, 0
XLAT

此时AL中存放的就是表中序号为0的元素的ASCII码

5. 取偏移地址的指令或运算符

  1. 取当前逻辑段偏移地址

LEA REG, MEM

功能:
  将当前逻辑段中的变量(内存单元的符号地址, 存储器操作数)的16位偏移地址写入通用寄存器(最好选择间址寄存器)

  1. 取段偏移地址运算符

OFFSET

MOV REG, OFFSET MEM

功能:
  与 LEA REG, MEM 等价

  1. 取段地址的运算符

MOV REG, SEG SEGMENT

功能:
  将段的16位地址存入REG中

  1. 远地址传送指令

LDS REG, SEGMENT:[偏移地址]

功能:
  将SEGMENT段的偏移地址位置的两个单元内容复制到REG, 将SEGMENT段的偏移地址 + 2 位置的内容复制到DS

LES REG, SEGMENT:[偏移地址]

功能:
  将SEGMENT段的偏移地址位置的两个单元内容复制到REG, 将SEGMENT段的偏移地址 + 2 位置的内容复制到ES

6. 字位扩展指令

对于无符号数, 用零扩展
对于有符号数, 用符号位扩展

CBW

功能:
  将寄存器AL数据的最高位扩展到AH

CBD
功能:
  将寄存器AX数据的最高位扩展到DX

7. 标志寄存器数据传送指令

PUSHF

功能:
  将FLAGS寄存器中的内容入栈。

POPF

功能:
  将栈顶的内容(栈顶两个单元的内容)复制到FLAGS寄存器中。

LAHF

功能:
  将FLAGS寄存器的低八位内容复制到AH寄存器中

SLAHF

功能:
  将AH寄存器的内容复制到FLAGS寄存器中

以上是关于8086指令系统 通用数据传送指令的主要内容,如果未能解决你的问题,请参考以下文章

8086、8088汇编指令大全

汇编语言通用数据处理指令——数据传送类指令

汇编语言通用数据处理指令——数据传送类指令

x86汇编指令详解

汇编语言通用数据处理指令——堆栈传送指令

汇编语言通用数据处理指令——堆栈传送指令