目录
数据传送类指令
数据传送指令是最基本最重要的一类指令,它能把数据从一个位置传送到另一个位置,除了标志寄存器传送指令,其他指令都不改变标志寄存器的值。
通用数据传送 | MOV | 字节或字的传送指令 |
PUSH | 入栈 | |
POP | 出栈 | |
XCHG | 字节或字的交换指令 | |
XLAT | 字节的查表指令 | |
目的地址传送 | LEA | 有效地址的传送 |
LDS | 偏移地址及其数据段段地址传送 | |
LES | 偏移地址及其附加段段地址传送 | |
I/O传送 | IN | I/O操作的输入 |
OUT | I/O操作的输出 | |
标志传送 | PUSHF | 标志寄存器入栈 |
POPF | 出栈至标志寄存器 | |
LAHF | SF、ZF、AF、PF、CF对位传送到AH | |
SAHF | AH对位传送到SF、ZF、AF、PF、CF |
MOV 操作数1,操作数2
该指令将数据从后者传到前者,操作数可以是立即数、寄存器、存储器,必须遵守下面的传送规则。
1、传送的数据长度如何确定?(字操作与字节操作由谁决定?)
- 汇编语言的操作符显式指明
mov byte ptr[bx],255;说明是字节操作 mov word ptr[bx],255;说明是字操作
- 当指令中有寄存器时,由寄存器的大小决定。
2、注意两个操作数类型要一致。
XCHG 操作数1,操作数2
该指令交换两个位置的数据,寄存器与寄存器交换,寄存器与存储器交换。
注意:
- 存储器与存储器之间不能交换
- 两个操作数的类型要一致,都是8位或都是16位
- 顺序无关
mov ax,1199h ;ax=1199h
xchg ah,al ;ax=9911h
;等同于 xchg al,ah
mov wvar,5566h ;wvar是一个字型变量
xchg ax,wvar ;ax=5566h,wvar=9911h
;等同于 xchg wvar,ax
xchg al,byte ptr wvar+1 ;ax=5599h,wvar=6611h
;“byte ptr wvar+1”强制为字节量,只取高字节与AL类型交换,否则数据类型不匹配
XLAT
该指令没有操作数,执行后将 ds:[bx+al]中的数据传送到al寄存器中。
将bx视为一个字节型表格的初始位置,al视为表格的序号,将该行表格数据传送到al中。也称之为查表指令或字节翻译指令。使用前,要提前将bx,al指向目标。
PUSH 操作数
入栈指令,操作数可以是寄存器和存储器。
ss:sp指向栈顶,入栈时,sp-2,数据入栈,低字节对应低位,高字节对应高位。
POP 操作数
出栈指令,操作数可以是寄存器和存储器
ss:sp指向栈顶,出栈时,数据传输到指定位置,sp+2.
注意:
- 栈操作都是字操作
- 对于cs寄存器,可以push,不能pop
LEA 16reg,mem
将mem的偏移地址传到16位的寄存器中。
LDS 16reg,mem
从mem存储单元开始,将前两个字节传到16位寄存器中,后两个字节传到ds中。
LES 16reg,mem
从mem存储单元开始,将前两个字节传到16位寄存器中,后两个字节传到es中。
I/O数据传输指令
IN AX/AL,8位端口号/dx
将端口数据传至ax或al中
OUT 8位端口号/dx,AX/AL
将ax/al中的数据输出到端口
注意:
- 数据的传输方向。in和out是相对cpu而言的。
- 当端口号小于8位时用立即数表示,当端口号大于8位小于16位时存入dx中使用。
- ax/al取决于传输数据的大小
标志传送
PUSHF
将16位标志寄存器的内容入栈,ss:sp指向栈顶。
POPF
数据出栈存入16位标志寄存器,ss:sp指向栈顶。
LAHF
将标志寄存器的低8位传入ah中
SAHF
将ah中的数据传入标志寄存器的低8位。
。。。。