文章目录
- MOV
- XCHG
- PUSH和POP
- IN和OUT
- XLAT
- LEA LDS LES
- LEA
- LDS
- LES
- LAHF SAHF
- PUSHF POPF
- 总结
MOV
MOV dst, src ; dst <-- src
- 可以进行8位或16位数据的传送
- 源操作数可为立即数、寄存器、存储器操作数
- 目的操作数不可为立即数,CS、IP寄存器
- 两操作数必有一个寄存器,不允许mem←mem,mem←#im
- 两操作数不能同为段寄存器,不允许seg←seg
- 不允许seg←立即数,不能将立即数赋到段寄存器中
- 源操作数与目的操作数类型要一致(位数相同)
例如:
MOV AL [BP]
MOV WORD PTR[SI], 4501H
MOV DS, [2000H]
MOV [BX][SI], AX
MOVES,AL;错
MOVES,CS;错
XCHG
两个寄存器、寄存器与存储单元之间(字或字节)的交换
XCHG OPR1, OPR2 ; OPR1 <--> OPR2
- 两操作数中必须有一个在寄存器中,不能同时为存储器操作数;
- 操作数不能为段寄存器和立即数;
- 源和目地操作数类型要一致(位数相同)。
例如:
XCHG AL, BL
XCHG [2200H], DX
PUSH和POP
具体堆栈操作请移步
- PUSH指令
PUSH r(寄存器)
PUSH mem(存储单元)
PUSH seg(段寄存器) - POP指令
POP r(寄存器)
POP mem(存储单元)
POP seg(段寄存器) - 堆栈操作总是按字进行,不允许对字节操作
- 不能从栈顶弹出一个字给CS寄存器,但是可以给IP寄存器
- 堆栈指针为SS:SP,SP永远指向栈顶
- SP自动进行增减量(-2,+2)
- 有一个操作数是隐含的,该操作数就是(SP)指示的栈顶存储单元
- 进行堆栈操作时,遵循“先进后出”原则
例如:
PUSH AX
POP AX
PUSH [BX][DI]
POP [2000H]
POP AL; 错
IN和OUT
请看这里
IO端口寻址
XLAT
查表转换指令,换码指令
假设以BX为偏移地址的内存中有一个表,那么AL就是表的索引,XLAT根据表的索引替换AL的值
这个指令没有参数,或者参数是BX的表地址
XLAT
XLAT TABLE
LEA LDS LES
- 有效地址送寄存器:LEA(Load effect address)
- 指针送寄存器和DS的指令:LDS
- 指针送寄存器和ES的指令:LES
- 要求源操作数必须是一个存储器操作数,寻址方式可以是24中任何一种
- 目的操作数r必须是一个16位的通用寄存器,而不能使用段寄存器
LEA
将存储器操作数的有效地址(EA)送至指定的16位通用寄存器
LEA r,src; r = src的EA
LEA BX, [BP+SI] ; BX = SS << 4 + BP + SI
LEA SP, [0502H] ; SP = DS << 4 + 0502H
就是将src
的EA算出来,赋给r
r = &src
LDS
LDS r, src ; r = src地址中的值 DS= (src+2)地址中的值
r = *&src
DS = *(&src+2)
一次改变两个寄存器的值(SI和DS)低地址的2字节分给SI,高地址的两字节分给DS
LES
LES,同上,但DS改为ES
LAHF SAHF
读取标志指令:LAHF(Load AH from flags)
设置标志指令:SAHF(store AH into flags)
只能是AH寄存器,所以没有操作数
PUSHF POPF
- 标志寄存器的入栈指令:PUSHF
- 标志寄存器的出栈指令:POPF
总结
- 除SAHF和POPF这两条指令外,其余所有指令均不影响标志位。
- 除XCHG之外,都是单向的数据传输