数据传送指令
-
movsx 符号扩展后传送
传送目标的字节数大于源字节数时,需要扩展后传送
符号扩展意思是:对于正数高位补0,对于负数高位全补1
1234; 例子movsx edx, byte ptr [ebp+edx-28]; 将地址为ebp+edx-28的一个字节(byte)的内容传送到edx,如果该字节为正(<=0x7F),则前三字节全补0,如果该字节为负,则补的三字节全为1(即0xFFF) -
movzx 补零后传送
1234; 例子movzx edx, byte ptr [ebp+edx-28]; 将地址为ebp+edx-28的一个字节(byte)的内容转送到edx,前三个字节均补0
算数运算指令
-
mul 无符号乘法
如果参数是8位,把 al 做乘数,结果放在 ax
如果参数是16位,把 ax 做乘数,结果放在 eax
如果参数是32位,把 eax 做乘数,结果放在 edx:eax (edx是高32位,eax是低32位)
1234; 例子mul bx ; eax = bx * axmul esi ; edx:eax = esi * eax (因为32位*32位结果可以有64位,所以要放在两个32位寄存器) -
imul 有符号乘法
操作数乘数和存放结果的寄存器与mul指令相同,乘数均为正时结果与mul相同,乘数为负时结果与mul不同
有三个操作数时,结果存放在第一个操作数中
123; 例子imul bx, ax, 2h ; bx = ax * 2 -
div 无符号除法
如果参数是8位,把 ax 作为被除数,商放在 al,余数放在 dl
如果参数是16位,把 eax 作为被除数,商放在 ax,余数放在 dx
如果参数是32位,把 edx:eax 作为被除数,商放在 eax,余数放在 edx
123456; 例子mov edx, 0mov eax, 7mov ebx, 2div ebx ; eax = edx:eax / ebx = 3, edx = edx:eax % ebx = 13 -
idiv 有符号除法
- cdq 扩展被除数
由于32位除法要求被除数为64位,执行idiv指令前需要先执行cdq指令
cdq(Convert Double to Quad)指令用于扩展被除数(将eax扩展成edx:eax),当eax为正数时,将edx置为0,当eax为负数时,将edx置为0xFFFFFFFF
123456; 例子mov eax, -17cdq ; 扩展被除数,因为eax是负数,所以edx=0xFFFFFFFFmov ecx, 3 ; ecx 是除数idiv ecx ; 商 eax = -5,余数 edx = -2 -
xor 异或
12xor eax, eax ; 自己异或自己,无论eax是什么结果都为0,相当于mov eax, 0
比较和转移指令
-
cmp 比较两个操作数 (以作减法的方式),一般在后面接跳转指令
123cmp dword ptr [ebp-30], 0D ; 比较(int类型的)局部变量[ebp-30]和0x0Djge short 00BE1148 ; 如果(int类型的)变量[ebp-30]大于等于0x0D,则跳转 -
test 比较两个操作数 (以作逻辑与的方式),一般在后面接跳转指令
123test eax, eax ; 自己和自己作逻辑与,相当于之间判断eaxjnz short 00BE121B ; eax不为0时候,跳转 -
跳转类指令 见下表
指令 英文全称 跳转条件 有无符号 je/jz equal/zero 为0或相等 – jne/jnz not equal/not zero 不为0或不相等 – jb below < 无符号 jae above equal >= 无符号 ja above > 无符号 jbe below equal <= 无符号 jl lower < 有符号 jge greater equal >= 有符号 jg greater > 有符号 jle lower equal <= 有符号
无符号(unsigned) 指的是所有数都为正数,0xFF 表示 255;有符号(signed) 指的是最高位为1时为负,最高位为0时为正,0xFF表示 -1。
装入指令
-
lea 将第二个操作数偏移地址装入第一个操作数
123lea edx, dword ptr [ecx+18] ; 将(int类型的)局部变量[ecx+18]的首地址放入edx,即edx = ecx+18lea eax, dword ptr [edx+edx*2] ; eax = edx+edx*2 = edx*3
重复指令
-
rep 重复的前缀
重复前缀 终止条件 1 终止条件 2 rep ecx=0 无 repe/repz ecx=0 zf=0 (结果为0时继续重复) repne/repnz ecx=0 zf=1