-
说明
r:通用寄存器
m:内存
imm:立即数
r8:8位通用寄存器
r16:16位通用寄存器
r32:32位通用寄存器
m8:8位内存
m16:16位内存
m32:32位内存
imm8:8位立即数
imm16:16位立即数
imm32:32位立即数
-
MOV:数据传送指令
MOV r/m8, r8
MOV r/m16, r16
MOV r/m32, r32
MOV r8, r/m8
MOV r16, r/m16
MOV r32, r/m32
MOV r8, imm8
MOV r16, imm16
MOV r32, imm32
-
ADD:加法指令
ADD r/m8, imm8
ADD r/m16, imm16
ADD r/m32, imm32
ADD r/m16, imm8
ADD r/m32, imm8
ADD r/m8, r8
ADD r/m16, r16
ADD r/m32, r32
ADD r8, r/m8
ADD r16, r/m16
ADD r32, r/m32
-
SUB:减法指令
SUB r/m8, imm8
SUB r/m16, imm16
SUB r/m32, imm32
SUB r/m16, imm8
SUB r/m32, imm8
SUB r/m8, r8
SUB r/m16, r16
SUB r/m32, r32
SUB r8, r/m8
SUB r16, r/m16
SUB r32, r/m32
-
AND:与运算指令
-
两个位都为1时,结果才为1。
AND r/m8, imm8
AND r/m16, imm16
AND r/m32, imm32
AND r/m16, imm8
AND r/m32, imm8
AND r/m8, r8
AND r/m16, r16
AND r/m32, r32
AND r8, r/m8
AND r16, r/m16
AND r32, r/m32
-
OR:或运算指令
-
当一个位为1时,结果才为1。
OR r/m8, imm8
OR r/m16, imm16
OR r/m32, imm32
OR r/m16, imm8
OR r/m32, imm8
OR r/m8, r8
OR r/m16, r16
OR r/m32, r32
OR r8, r/m8
OR r16, r/m16
OR r32, r/m32
-
XOR:异或运算指令
-
两个位不一样时,结果才为1。
XOR r/m8, imm8
XOR r/m16, imm16
XOR r/m32, imm32
XOR r/m16, imm8
XOR r/m32, imm8
XOR r/m8, r8
XOR r/m16, r16
XOR r/m32, r32
XOR r8, r/m8
XOR r16, r/m16
XOR r32, r/m32
-
NOT:非运算指令
-
位为1时,结果为0,位为0时,结果为1。
-
1就是0,0就是1,也就是取反。
NOT r/m8
NOT r/m16
NOT r/m32
-
MOVS:数据传送指令(内存<->内存)
-
BYTE/WORD/DWORD
MOVS BYTE PTR ES:[EDI], BYTE PTR DS:[ESI] //简写为:MOVSB
MOVS WORD PTR ES:[EDI], WORD PTR DS:[ESI] //简写为:MOVSW
MOVS DWORD PTR ES:[EDI], DWORD PTR DS:[ESI] //简写为:MOVSD
-
ESI、EDI寄存器:
当需要把数据从内存复制到内存时使用,这两个寄存器在MOVS指令中是指定的。使用MOVS指令时,默认使用的就是ESI和EDI寄存器。
注意:使用MOVS指令,ESI、EDI寄存器的值执行完成后会自增。例:
MOV EDI, 0x12FFD8
MOV ESI, 0x12FFD0
MOVS DWORD PTR ES:[EDI], DWORD PTR DS:[ESI] //观察EDI的值
修改标志寄存器中D位的值,然后再执行下面的指令:
MOV EDI, 0x12FFD8
MOV ESI, 0x12FFD0
-
标志寄存器:EFL
例如当前标志寄存器EFL的值为00000246,将其转换为二进制:
0000 0000 0000 0000 0000 0010 0100 0110
它的第十位(从右往左数)叫做DF位(方向位)。
如果DF位为0时,当使用MOVS指令,ESI与EDI寄存器的值都会自增(取决于是操作BYTE、WORD还是DWORD)。
如果DF位为1时,当使用MOVS指令,ESI与EDI寄存器的值都会自减(取决于是操作BYTE、WORD还是DWORD)。
-
标志位
-
这些标志位是EFL标志寄存器的二进制被OD单独拿出来表示了
-
STOS:将AL/AX/EAX的值储存到[EDI]指定的内存单元
-
使用STOS指令后EDI的值也会自动变化:
自增自减取决于DF位,自增自减的值取决于是操作BYTE、WORD还是DWORD。
STOS BYTE PTR ES:[EDI] //简写为:STOSB
STOS WORD PTR ES:[EDI] //简写为:STOSW
STOS DWORD PTR ES:[EDI] //简写为:STOSD
MOV EAX, 0x12345678 //观察EDI的值
MOV EDI, 0x12FFC4
STOS BYTE PTR ES:[EDI]
STOS WORD PTR ES:[EDI]
STOS DWORD PTR ES:[EDI]
修改标志寄存器中D位的值,然后再执行下面的指令:
MOV EAX, 0x12345678
MOV EDI, 0x12FFC4
STOS BYTE PTR ES:[EDI] //观察EDI的值
STOS WORD PTR ES:[EDI]
STOS DWORD PTR ES:[EDI]
-
REP:循环指令
-
该指令循环执行次数取决于ECX寄存器中的值。
MOV ECX,0xA //循环执行10次,每循环1次,ECX寄存器的值减1
REP MOVSD
REP STOSD