数据传送类指令
注意点
- 除 (SAHF、POPF) 指令外,其余传送类指令CPU执行后,对6个状态标志均无影响。
也就是说,除 (SAHF、POPF) 指令外,CPU只是做了数据传送,并没有进行数据运算,对状态标志位无影响。
- 语法规则
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
注意两点:
-
DST,SRC的内容均不能为立即数
-
所有的段寄存器不能参加交换
例如
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也叫查表指令。
堆栈操作指令
有四条,堆栈操作指令必须 按字(双字节)操作 。
- 压入堆栈指令-PUSH
格式为
PUSH SRC ;将SRC压入堆栈
SRC不能为立即数
- 弹出堆栈指令-POP
格式为
POP DST ;从堆栈弹出DST
- PUSHF
PUSHF为隐含寻址,格式为
PUSHF ;将(PSW)压入堆栈
- POPF
POPF为隐含寻址,格式为
POPF ;从堆栈弹出一个字,送给(PSW)