8086CPU中的数据传送类指令

数据传送类指令

注意点

  1. \(SAHF、POPF\) 指令外,其余传送类指令CPU执行后,对6个状态标志均无影响。

也就是说,除 \(SAHF、POPF\) 指令外,CPU只是做了数据传送,并没有进行数据运算,对状态标志位无影响。

  1. 语法规则

1)立即数只能做源操作数

2)类型一致

3)类型明确

4)当ES、DS、SS做目的操作数时,源操作数不能是立即数。

5)CS、IP不能做目的操作数

6)两存储器单元之间不能直接操作

数据传送类指令

通用数据传送指令-MOV

mov指令的格式为

MOV DST,SRC

取有效地址指令-LEA

LEA指令的格式为

LEA REG_16,MEM

REG_16表示一个16位寄存器,理论上只要是16位即可,但是因为存放有效地址,所以最好是 BX、BP、SI、DI

MEM是5种存储器寻址方式之一指明的一个存储器单元。

例如

LEA BX,data1 ;data1是变量,直接寻址找到这个存储单元把有效地址送给BX

等同于

MOV BX,OFFSET data1

功能一样。

取地址指针指令-LDS、LES

这两个指令是将双字变量MEM内容中的高16位送入DS/ES,低16位送入指定的REG16中。这里REG16不允许为段寄存器。

不常用,了解。

以LDS为例,格式为

LDS REG_16,MEM

REG_16表示一个16位寄存器

MEM是5种存储器寻址方式之一指明的一个存储器单元

例如

TABLE DB 10H,20H...
LDS BX,TABLE ;TABLE的段地址->(DS),TABLE的偏移地址->(BX)

得到地址指针,就可以很容易取数据

MOV DX,[BX]

实际中LEA用的比较多。

标志传送指令-LAHF、SAHF

指令LAHF(load AH register from flags)可以将PSW寄存器中的低8位传送到AH中,指令SAHF(store AH register from flags)可以将AH的内容传送到PSW寄存器中的低8位。

源操作数和目的操作数的寻址方式均为隐含寻址方式。

数据交换指令-XCHG

XCHG指令完成两个操作数之间数据的交换

XCHG指令格式为

XCHG DST,SRC 

注意两点:

  1. DST,SRC的内容均不能为立即数

  2. 所有的段寄存器不能参加交换

例如

XCHG AX,BX
XCHG DL,DH
XCHG AX,[SI+3]

字节转换指令-XLAP

XLAP为隐含寻址,格式为

XLAP ;DS:(BX)+(AL)->(AL)

右边默认在数据段,以BX内容为基址加上以AL为内容的相对位移量,作为有效地址,寻找一个存储单元,将这个单元的内容传送给AL。

XLAP非常适合两个代码之间的交换(查表)

例如

TABLE DB 30H,31H,32H,33H... ;在DS段定义字符0-9,存储为ASCII码
...
mov AL,3 ;通过查表得到字符3
LEA BX,TABLE ;BX默认数据段,执行后TABLE的偏移地址属性传送给BX
XLAB ;(AL)= 33H

所以XLAB也叫查表指令。

堆栈操作指令

有四条,堆栈操作指令必须 按字(双字节)操作

  1. 压入堆栈指令-PUSH

格式为

PUSH SRC ;将SRC压入堆栈

SRC不能为立即数

  1. 弹出堆栈指令-POP

格式为

POP DST ;从堆栈弹出DST
  1. PUSHF

PUSHF为隐含寻址,格式为

PUSHF ;将(PSW)压入堆栈
  1. POPF

POPF为隐含寻址,格式为

POPF ;从堆栈弹出一个字,送给(PSW)
posted @ 2021-03-16 00:13  懒懒阳光下的午睡  阅读(802)  评论(0编辑  收藏  举报