数据传送指令
通用传送指令
MOV
MOVSX
MOVZX
LEA
指针传送指令
LDS
LES
LFS
LOS
LSS
标志寄存器传送指令
LAHF
SAFH
交换指令 XCHG
字节交换指令 BSWAP
查
指令 XLAT
堆栈操作指令
进栈指令 PUSH
出栈指令 POP
16位标志寄存器栈操作
进栈指令 PUSHF
出栈指令 POPF
32位标志寄存器栈操作
进栈指令 PUSHFD
出栈指令 POPFD
16位通用寄存器栈操作
进栈指令 PUSHA
出栈指令 POPA
32位通用寄存器栈操作
进栈指令 PUSHAD
出栈指令 POPAD
通用传送指令
指令名
格式
功能描述
影响标志位
注意事项
MOV
MOV DST, SRC
(DST) ←(SRC)
将一个字节或一个字操作数从源地址传送至目的地址。
MOV指令不改变源操作数,也不影响标志位
1)源和目的操作数不能同时为存储器操作数
例:MOV [DI],[SI];是非法指令
2)立即数不能作为目的操作数
例:MOV 1234H,AX ;是非法指令
3)不能将立即数直接传送到段寄存器
例:MOV DS,1000H;是非法指令
4)源和目的操作数的数据位应等长,即同为字节、字或双字。
必须用PTR运算符说明目的操作数的属性(可以是BYTE、WORD、DWORD)。
MOV BYTE PTR [BX],12H
5)以CS为目标的一切转送都是非法的。
MOVSX
MOVSX DST,SRC
Move with Sign Extend (386+)
将SRC的符号位向高位扩展,使其与目标操作数字长相同,再送到DST,而SRC保持不变。
MOV指令不改变源操作数,也不影响标志位
(1)DST为REG16或REG32,SRC为小于等于DST的立即数或存储器操作数或寄存器操作数。
(2)对于带符号数的补码,扩展前后的真值相等,只有补码的位数不同。
例:
MOV DL,-16 ; DL=0F0H
MOVSX BX,DL ; BX=0FFF0H, DL不变
MOVZX
MOVZX DST,SRC
Move with Zero Extend (386+)
将SRC的高位用0补充,使其与目标操作数字长相同,再送到DST,而SRC保持不变。
MOV指令不改变源操作数,也不影响标志位
(1)DST为REG16或REG32,SRC为小于等于DST的立即数或存储器操作数或寄存器操作数。
(2)对于无符号数的真值不变。
例:
MOVZX EAX,CX
LEA
有效地址送寄存器指令
LEA REG,SRC; MOV DES, OFFSET SRC
LEA:Load Effective Address
REG ←(EA OF SRC) 把源操作数的有效地址送到指定的寄存器。
SRC为内存操作数。
REG为16位或32位寄存器(除段寄存器)
LEA等效于MOV OFFSET
所以不影响标志位
指令名
格式
功能描述
影响标志位
注意事项
指针传送指令
LDS
LES
LSS
LFS
LOS
操作码助记符 REG,SRC
LDS等英文含义:
Load to DataSegReg
其后两位字母表段寄存器, 它们是隐含的目标寄存器.
将源操作数高16位送隐含的目标段寄存器;
不影响标志位
若源操作数是32位内存操作数, 则将低16位送目标通用寄存器.
若源操作数是48位内存操作数, 则将低32位送目标通用寄存器.
标志寄存器传送指令
LAHF
操作数为隐含的AH和标志寄存器。
LAHF:Load to AH with Flag
AH ←(PSW的低位字节)
不影响标志位
PSW的低位字节包括
SF符号标志
ZF零标志
AF半进位标志
PF奇偶标志
CF进位标志
SAHF
操作数为隐含的AH和标志寄存器。
SAHF:Sent AH to Flag
(PSW低位字节)←(AH)
这不是废话吗!
交换指令XCHG
XCHG OPR1,OPR2
XCHG:exchange 交换
(OPR1 ) <=> (OPR2)
不影响标志位。
OPR1与OPR2须是等长操作数,
OPR1,OPR2必须有一个是寄存器。(段寄存器不能作为XCHG的操作数)
查表指令
XLAT
XLAT 表头变量名
AL←(DS:[BX+AL] )
AL ←(DS:[EBX+AL])
把一种码转换为另一种码
不影响标志位
使用
:
1、建立表格,将表格的首地址预先存入BX或EBX。
2、要转换的代码与表格首地址的偏移量存入AL。
3、执行换码指令,
(DS:[BX+AL] )→AL
示例:
第一步:在数据段按字形0~F的顺序设置一张字形编码表。
TAB DB 3FH,06H,5BH,4FH,
NUM DB 02H;
第二步:在代码段设置如下指令:
MOV DS,数据段段基址
MOV BX,OFFSET TAB; (LEA BX, TAB)
MOV AL,NUM
XLAT TAB
BSWAP
BSWAP REG32
Byte Swap (486+)
将32位REG的
位31~位24 与 位7~位0交换,
位23~位16与位15~位8交换。
不影响标志位
堆栈操作指令
指令名
格式
功能描述
影响标志位
注意事项
进栈指令PUSH
PUSH SRC
执行时, 首先调整堆栈指针,然后把源操作数压栈。
执行操作:
16位:(SP) ←(SP)-2
((SP)+1,(SP)) ←(SRC)
32位:(ESP) ←(ESP)-4 ((ESP)+3 ~ (ESP)) ←(SRC)
不影响标志位
内存操作数若不是直接寻址, 则必须用PTR运算符来说明其属性。
例, PUSH WORD PTR [BX]
堆栈操作的基本单位是字!
出栈指令POP
POP DST
先将栈顶弹出2个或4个字节,送目标操作数,
然后调整堆栈指针。
执行操作:
16位:
((SP)+1,(SP))→(DST) (SP) ←(SP) + 2
32位:
((ESP)+3~(SP)) →(DST)
(ESP) ←(ESP) +4
不影响标志位
跟上面是一样的。要知道他们是双子星。
16位标志寄存器
进栈PUSHF出栈POPF
PUSHF (Push Flag)
POPF (Pop Flag)
PUSHF:
SP = SP –2
SS:[SP] ← Flag 的低16位
POPF:
Flag 的低16位←SS:[SP]
SP = SP +2
PUSHF 不改变标志位
POPF:这也是废话 当然会啦!
32位标志寄存器
进栈 PUSHFD
出栈
POPFD
PUSHFD
POPFD
PUSHFD
ESP = ESP –4
SS:[ESP] ←32位EFLAGE
POPFD
32位EFLAGE ←SS:[ESP]
ESP = ESP +4
PUSHFD 不改变标志位
POPFD:这也是废话 当然会啦!
16位通用寄存器
进栈PUSA
出栈POPA
32位通用寄存器
进栈PUSAD
出栈POPAD
PUSHA (Push AX)
POPA (Pop AX)
PUSHAD
POPAD
PUSHA:(PUSHAD)
SP = SP –16 (32)
再依次将(E)AX,CX,DX,BX,SP,BP,SI,DI
入栈。
POPA:(POPA)
将栈内的内容依次弹出至(E)DI,SI,BP,SP,BX,DX,CX,AX
SP = SP +16 (32)
不改变标志位
进栈与出栈通用寄存器顺序时相反的
算术运算指令
加法指令
ADD
ADC
INC
XADD
减法指令
SUB
SBB
DEC
NEG
CMPXCHG
乘法指令
MUL
IMUL
除法运算
DIV
IDIV
符号扩展指令
字节转换为字指令CBW
字转换为双字指令CWD
十进制调整指令
压缩BCD码调整指令
加法调整指令 DAA
减法调整指令 DAS
非压缩BCD码调整指令
加法调整指令 AAA
减法调整指令 AAS
乘法调整指令 AAM
除之前调整指令 AAD
加法指令与减法指令
指令名
格式
功能描述
影响标志位
注意事项
加法指令
ADD
ADD DST,SRC
DST←(DST) + (SRC)
影响的标志位:CF,OF,SF,ZF,PF,AF
(1)两个操作数不能同时为存储器操作数;
(2)如果SRC是立即数,DST是存储器操作数,则DST必须用PTR说明是字节还是字型或是双字型,否则汇编时会出错.
带进位的加法指令
ADC
ADC DST,SRC
DST←(DST)+(SRC)+CF
CF是上一条指令执行后产生的C标志。
影响的标志位:CF,OF,SF,ZF,PF,AF
同ADD
加1指令
INC
INC OPR
(OPR)←(OPR) + 1
INC指令不影响CF标志,但影响AF,OF,PF,SF,ZF
(1)INC指令的操作数不能是立即数
(2)当INC的操作数是存储器操作数时,必须用PTR说明符说明其属性.
交换加法指令
XADD
XADD DST,SRC
首先SRC与DST互换,然后(SRC+DST)→(DST)
目的操作数和源操作数相加,并使源操作数保存目的操作数的值
设置 CF PF AF SF ZF OF
与ADD的区别就是ADD指令会使DST的值被取代,SRC的值被保留,而XADD的功能刚好相反
DST是寄存器操作数或内存操作数, SRC 只能是与DST等长的寄存器操作数。
减法指令SUB
SUB DST,SRC
DST←(DST)–(SRC)
CF,OF,SF,ZF,PF,AF
同ADD
带借位减法指令
SBB
SBB DST,SRC
DST←(DST)–(SRC)–CF
CF,OF,SF,ZF,PF,AF
同ADD
减1指令DEC
DEC OPR
(OPR)←(OPR)–1
不影响CF标志,但影响AF、OF、
PF、SF、ZF
②DEC指令的操作数不能是立即数
③当DEC的操作数是存储器操作数时,必须用PTR说明符说明其属性。
求补指令NEG
NEG OPR
OPR←?(OPR)
NEG指令影响AF、OF、PF、SF、ZF、CF。
③对CF的影响: 只有当(OPR) = 0时,执行完NEG后CF = 0,其他情况CF=1;
④对OF的影响: 当(OPR) = -128或(OPR) = -32768时OF = 1,其他情况OF = 0。
NGE求OPR的相反数;
若原OPR为正,在执行NEG后,变为补码表示的负数。
若原OPR为补码表示的负数, 则执行完NEG后, 变为正数。
比较指令CMP
CMP DST,SRC
(DST) – (SRC)
执行的结果不回送DST, 而是根据结果去影响的标志位:
CF,OF,SF,ZF,PF,AF。
CMP常用于转移指令之前。
当SRC为立即数时, DST为非直接寻址的内存操作数寻址时, 须用PTR指明DST属性。
比较并交换指令
CMPXCHG
CMPXCHG DST,SRC
将DST与AL/AX/EAX比较,若相等,则将SRC送DST;若不等,则将DST送AL/AX/EAX.
根据结果去影响的标志位:
CF,OF,SF,ZF,PF,AF。
乘除法指令
指令名
格式
功能描述
影响标志位
注意事项
无符号数乘法指令
MUL
MUL SRC
乘数和被乘数须是等长的无符号二进制数, 乘积为双倍长; 被乘数默认在累加器中(AL/AX/EAX)。
执行的操作:
字节操作:
(AX)←(AL) * (SRC)
字操作:
(DX,AX)←(AX) * (SRC)
双字操作:
(EDX,EAX)←(EAX) * (SRC)
影响CF、OF标志位,
其他无定义。
(1)源操作数是除立即数之外的寻址方式。
(2)如果乘积的高半部分为0,
(即AH = 0、DX = 0或 EDX=0 )
则CF=OF = 0,
否则 CF = OF = 1
带符号数乘法指令
IMUL
格式1
IMUL SRC
字节操作:
(AX)←(AL) * (SRC)
字操作:
(DX,AX)←(AX) * (SRC)
双字操作:
(EDX,EAX)←(EAX) * (SRC)
标志位的影响:CF、OF,
其他无定义。
①源操作数是除了立即数之外的寻址方式。
②如果乘积的高一半是低一半的符号扩展则 CF=OF = 0,
否则 CF = OF = 1
格式2
IMUL DST, SRC
(DST) ← (DST) * (SRC)
①如果乘积的高一半是低一半的符号扩展则 CF=OF = 0,
否则 CF = OF = 1。
格式3
IMUL DST,SRC,DATA
DST← DATA * (SRC)
①如果乘积的高一半是低一半的符号扩展则 CF=OF = 0,
否则 CF = OF = 1。
DIV 无符号数的除法指令
DIV SRC
字节操作:
16 位被除数放在AX中,8位除数为源操作数。结果的8位商在AL中,8位的余数在AH中。
表示为:
(AL)← (AX)/(SRC)的商
(AH)← (AX)/(SRC)的余数
字操作:
32 位被除数在DX,AX中,16位除数为源操作数。结果的16位商在AX中,16位的余数在DX中。
表示为:
(AX)←(DX,AX)/(SRC)的商
(DX)←(DX,AX)/(SRC)的余数
双字操作:
64 位被除数在EDX,EAX中,32位除数为源操作数。结果的32位商在EAX中,32位的余数在EDX中。
表示为:
(EAX)←(EDX,EAX)/(SRC)的商
(EDX)←(EDX,EAX)/(SRC)的余数
执行DIV,运算后对标志位无确定影响,都没有意义。
商超过规定的范围,去执行0型中断。
(系统会报错)
IDIV有符号数的除法指令
IDIV SRC
同上
运算后对标志位无确定影响
①除数、被除数和商值都是有符号补码数。
②若被除数与除数等长时,须先将被除数符号扩展。
字节转换为字CBW
CBW
将AL的符号位扩展到AH。
不影响标志位
字转换为双字CWD
CWD
AX的符号位扩展到DX
不影响标志位