一.传送指令
格式:mov dst, src
源操作数可以使累加器,寄存器,存储单元,立即数。
目的操作数不能为立即数。
注意问题:
源和目的操作数不能同时是段寄存器;代码段寄存器cs不能作为目的寄存器;ip既不能作为源,也不能作为目的。
源操作数与目的操作数类型要一致16对16位, 8位对8位。
两个操作数不能都为存储器,必须有一寄存器。
数据传送指令能实现下列传输功能:
1.cpu内部寄存器间数据传送
mov ah, al
mov dl, dh
mov bp, sp
mov as, cs
2.立即数送通用寄存器或存储单元(立即数不能直接送到段寄存器)
mov al, 2
mov si, –5
mov varb, –1
mov varw, 1234h
mov [si], 1234h
mov al, ‘D’
3.寄存器与存储器间数据传送
mov a, varw
mov bh, [di]
mov dl, es:[si+3]
mov varb, dl
mov ds:[bp], dl
mov varw, ds
mov es, varw
--------------------------------
mov ax, offset table
offset为属性操作符,把table偏移地址送至ax。
二.交换指令
通用寄存器与通用寄存器或存储单元数据的交换,但不包括段寄存器,也不能同时是存储单元,还不能有立即数。
格式:
xchg oprd1, oprd2
三.地址传送指令
(1)lea
传送有效地址指令
格式:
lea reg, oprd
oprd必须是一个存储器操作数
reg必须是一个16位通用寄存器
lea ax, buffer
lea ds, [bs+s]
lea sl, [bx+si+2]
(2)lds
段值和段内偏移构成一个32位地址指针,该指令传送这个32位指针
格式:
lds reg, oprd
reg<-[src]
ds<-[src+2]
段值送到ds
偏移送到reg
(3)指令les(load point into es)
les也是传送32位地址指针
les reg, oprd
reg<-[src]
es<-[src+2]
四.堆栈操作指令
堆栈操作以字为单位。
(1)进栈push
格式:
push src
执行操作:sp<-sp – 2
先把堆栈指针寄存器sp的值减2,然后把源操作数src送入由sp所指的栈顶,源操作数src可以是通用寄存器喝段寄存器,也可是字存储单元。
(2)出栈pop
格式:
pop dst
dst可以是通用寄存器喝段寄存器(cs例外),也可是字存储单元。
例子1:
临时保存寄存器内容
push ax
push bx
pop bx
pop ax
例子2:
push si pop si
push ds pop ds
push varw pop varw
push[si] pop [si]
数据交换的三种方式:
用mov,利用寄存器过度方法
mov bx, ax
mov ax, si
mov si, bx
用交换指令xchg
xchg ax, si
用堆栈指令
push si
push ax
pop ax
pop si
五.标志操作指令
(1)标志传送指令
LAHF(load ah with flags)
该指令把标志寄存器的低8位(包括sf,zf,af,pf,cf)传送到寄存器ah的指定位。
SAHF
与LAHF相反
PUSHF
该指令把标志寄存器内容压入堆栈
POPF
(2) 标志位操作指令
CLC清进位标志
STC置进位标志,进位标志位1.
CMC进位标志取反指令
CLD清方向标志指令,使方向标志DF为0.
STD置方向标志
CLI清中断允许标志指令,该指令使中断允许标志IF为0,cpu不再响应来自外部装置的可屏蔽中断,但对不可屏蔽中断和内部中断都没有影响。
STI置中断允许标志允许指令,该指令使IF为1,cpu可以响应可屏蔽中断。