@[TOC]
1 nop 指令
定义:不执行任何操作。
2 现场保护指令
2.1 push 与 pop
push:入栈。
pop:出栈
2.2 pushad 与 popad
定义:对寄存器的现场保护
pushad相当于如下8条指令:
push eax
push ecx
push edx
push ebx
push esp
push ebp
push esi
push edi 最顶指向
AI 代码解读
popad作用则相反
2.3 pushfd 与 popfd
定义:是对标志位进行的现场保护
3 内存操作
3.1 mov指令
定义:对操作数进行赋值,操作数可以是寄存器、数值、间接寻址的内存数据。
mov eax,0x1
mov dword [44907D],1
mov al,dh
mov byte [449086],0xff
AI 代码解读
3.2 movsx 与 movzx
- movsx:带符号扩展,并传送
- movzx:无符号扩展,并传送
movsx eax,cx
movzx eax,cx
# 8位扩展到32位
movzx eax,ax
AI 代码解读
4 lea 指令
定义:去内存地址(非数据)
(需继续研究)
5 xchg 指令
定义:交换指令
与内存交换
xchg eax, [449080]
AI 代码解读
与寄存器交换
mov eax,0x1
mov ecx,0x2
xchg eax,ecx
AI 代码解读
6 算数运算指令
6.1 add 与sub指令
add
:加法指令,2个操作数相加,结果返回给第1个操作数。
mov eax,0x5
mov ecx,0x7
add eax,ecx
# 低8位+1
add al,0x1
还可以和地址相加,但是这里测试未通过
mov eax,0x1
add eax, [40190]
AI 代码解读
sub
:减法指令,2个操作数相减,结果返回给第1个操作数。
mov eax,0x9
mov ecx,0x6
sub eax,ecx
sub ax,0x1
AI 代码解读
6.2 adc 与 sbb 指令
adc
:与add不同的是,它需要额外加上cf进位标志位寄存器的值。
令 cf=1
mov eax,0x3
mov ecx,0x2
adc eax,ecx
结果:
eax=6
进位标志位:cf=0
奇偶标志位:pf=1
AI 代码解读
sbb
:与sub不同的是,它需要额外减去cf进位标志寄存器的值。
令 cf=1
mov eax,0x3
mov ecx,0x2
sbb eax,ecx
结果:
eax=6
进位标志位:cf=0
奇偶标志位:pf=1
AI 代码解读
6.3 inc 与 dec 指令
inc
:该指类似于 C语言中的 i++或者i=i+1。
mov eax,0x2
inc eax
AI 代码解读
deg
:递减
6.4 cdq、mul 与 div 指令
cdq
:扩展,它是将eax扩展成 edx:eax
mul
:乘法指令,对操作数进行乘法运算,结果放在eax,如果溢出则扩展存放到edx。
mov eax,0x2
mov ecx,0x3
mul ecx
AI 代码解读
mov eax,0x5
mov ecx,0x3
cdq
div ecx
AI 代码解读
div
:除法指令,对操作数进行除法运算,根据多少位的寄存器而不同存放的商和余数的位置也不同。
cl 低8位做除数,商在al存储,余数在ah存储。
mov eax,0x5
mov ecx,0x3
cdq
div cl
AI 代码解读
6.5 imul 与 idiv 指令
imul
:也是乘法指令,却别在它有多个操作数,并且溢出直接舍去溢出的值。
操作数位3个的时候,第一个寄存器作为存储结果使用。idiv
:跟imul一样,有多个操作数,丢弃溢出。
6.6 xadd 与 neg 指令
xadd
:互换并相加指令,结果返回第1个操作数。
mov eax,0x2
mov ecx,0x3
xadd eax,ecx
AI 代码解读
xadd eax,ecx
相当于
xchg eax,ecx
add eax,ecx
AI 代码解读
neg
:指令取反指令。
mov eax, 6
neg eax
AI 代码解读
7 位运算指令
7.1 and 与
and
为逻辑 与 运算,通过位运算得出结果。
- 相同为1,不同为0(都为0则不变)
3 0011
5 0101
0001
mov eax,0x3
mov ecx,0x5
and eax,ecx
AI 代码解读
7.2 or 或
or
:逻辑 或 运算,通过位运算得出结果。
只要有1,则为1;2个都为0则为0
3 0011
5 0101
---------
7 0111
mov eax,0x3
mov ecx,0x5
or eax,ecx
AI 代码解读
7.3 xor 异或
xor
:逻辑异或运算,通过位运算得出结果。
- 相同为0,不同为1。
3 0011
5 0101
---------
7 0110 6h
mov eax,0x3
mov ecx,0x5
xor eax,ecx
AI 代码解读
7.4 not 取反
not
:逻辑取反运算,通过位运算得出结果。
- 1则为0, 0则为1
3 0000 0000 0000 0000 0000 0000 0000 0011
---------
7 11111111111111111111111111111100
mov eax,0x3
not eax
AI 代码解读
8 比较指令
8.1 cmp 比较
cmp
:比较指令,2个操作数,通常是比较2个值是否相等,影响标志位寄存器。
- 结果为truw,zf(零标志位)为1,不同为0
与sub指令不同的是,cmp指令不存储结果。
mov eax, 0x1
mov ecx, 0x2
cmp eax,ecx
AI 代码解读
8.2 test 逻辑比较
test
:比较指令,2个操作数,类似于逻辑与运算,但是结果不进行赋值,而是影响标志位寄存器,达到跳转指令的目的。
mov eax,0x0
test eax,eax zf 为1
je 44908f 跳转
mov eax,0x2
test eax,eax zf 为0
je 44908f 不跳转
AI 代码解读
9 跳转类指令
9.1 jmp 无条件跳转
jmp
:无条件跳转,不根据标志位来改变程序逻辑。
jmp 00449087
AI 代码解读
9.2 je 与 jz 相等跳转
定义:je与jz根据 zf 标志位来进行跳转,
- zf=1:跳转
- zf=0:不跳转
注释:je与jz相同
mov eax,0x1
mov ecx,0x2
cmp eax,eax
je short 0044908F
AI 代码解读
9.3 jne 与 jnz 不相等跳转
定义:jne 与 jnz 根据 zf 标志位来进行跳转
- zf=0,不相等 跳转
- zf=1,相等 不跳转
mov eax,0x1
cmp eax,eax
jne short 0044908F
AI 代码解读
补充
jnz与je写到一起相当于无条件跳转jmp
mov eax,0x1
cmp eax,eax
jne 0044908F
je 0044908F
AI 代码解读
9.4 js 负数 跳转
定义:js如果结果为负数时,sf置1
- sf=1 负数 跳转
- sf=0 正数 不跳转
mov eax,0x1
mov ecx,0x2
cmp eax,ecx 1-2=-1
js 44908F 跳转
AI 代码解读
9.5 jns 正数 跳转
定义:如果比较结果为正数,SF置0
- sf=0 正数 跳转
- sf=1 非正数 不跳转
9.6 jp[jpe] 偶 跳转
定义:如果比较结果(二进制1的个数)为偶数时,PF置1
- PF=1 偶数 跳转
- PF=0 奇数 不跳转
mov eax,0x4
mov ecx,0x1
cmp eax,ecx 4-1=(3)d=(0011)o
jp 44908F 1为偶数个,跳转
AI 代码解读
9.7 jnp[jpo] 奇 跳转
定义:如果比较结果(二进制1的个数)为奇数时,PF置0
- PF=0 奇数 跳转
- PF=1 偶数 不跳转
9.8 jo 溢出跳转
定义:jo为溢出标志位跳转指令
- OF=1 溢出 跳转
- OF=0 不跳转
以32位举例如下:
最大正数:7FFFFFFF~2147483647(有符号)
mov eax,0x7FFFFFFF
add eax,0x1
jo 0044908F
AI 代码解读
9.9 jb 无符号 产生进位跳转
定义:比较后,如果第一个操作数 < 第2个操作数,CF置1
- CF=1 跳转
- CF=0 不跳转
mov eax,0x1
mov ecx,0x2
cmp eax,ecx 1-2,产生借位,CF=1
jb 00449091 跳转
AI 代码解读
9.9 jnb 未产生进位跳转
定义:2个操作数比较,第一个操作数 > 第二个操作数,CF置0
- CF=0 跳转
- CF=1 不跳转
mov eax,0x2
mov ecx,0x1
cmp eax,ecx 未产生借位,CF=0
jb 00449091 不跳转
AI 代码解读
9.9 jbe C和Z标志位跳转
定义:操作数1 < 操作数2 的时候,
- CF=1或ZF=1,跳转
- 反之,不跳转
CF:进位标志位(产生进位/错位时,CF=1)
ZF:零标志位(运算结果为0时,ZF=1)
9.9 jnbe[ja] C和Z标志位跳转
定义:操作数1 > 操作数2 的时候
- CF=0且ZF=0,跳转
- 只要有1,则不跳
9.10 jl 有符号 S标志位跳转
jl与jb类似的是 比较 操作数1 < 操作数2 的跳转,但主要根据SF(符号)标志位跳转。
- SF=1,负数 跳转
- SF=0,不跳转
mov eax,0x1
mov ecx,0x2
cmp eax,ecx 1-2<0 则 SF=1
jl 499091 实现跳转
AI 代码解读
10 函数call指令
类似于jmp指令,但它主要用于调用一个子程序或函数。
call 地址
retn
AI 代码解读
11 循环类指令
11.1 跳转实现
xor eax,eax
mov ecx,0x5
dec ecx
test ecx,ecx
jnz 00449087
AI 代码解读
11.2 loop指令
定义:根据寄存器 ECX值,递减直到为1时,不在继续循环。
xor edx,edx
mov ecx,0x5
inc edx
nop
nop
loopd 00449097
AI 代码解读
loopd:32位
loopw:16位
12 寻址方式
12.1 直接寻址
根据直接看到的指令干的什么,就是直接寻址
push 0x123456
mov eax,0x2
inc eax
dec ebx
mov ecx,0x3
add eax,0x5
push eax
AI 代码解读
12.2 间接寻址
肉眼看的话,不知道结果,通过CPU运行到此处,才能得出结果