汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

时间:2021-03-20 01:17:56


文章目录

  • 1 nop 指令
  • 2 现场保护指令
  • 2.1 push 与 pop
  • 2.2 pushad 与 popad
  • 2.3 pushfd 与 popfd
  • 3 内存操作
  • 3.1 mov指令
  • 3.2 movsx 与 movzx
  • 4 lea 指令
  • 5 xchg 指令
  • 6 算数运算指令
  • 6.1 add 与sub指令
  • 6.2 adc 与 sbb 指令
  • 6.3 inc 与 dec 指令
  • 6.4 cdq、mul 与 div 指令
  • 6.5 imul 与 idiv 指令
  • 6.6 xadd 与 neg 指令
  • 7 位运算指令
  • 7.1 and 与
  • 7.2 or 或
  • 7.3 xor 异或
  • 7.4 not 取反
  • 8 比较指令
  • 8.1 cmp 比较
  • 8.2 test 逻辑比较
  • 9 跳转类指令
  • 9.1 jmp 无条件跳转
  • 9.2 je 与 jz 相等跳转
  • 9.3 jne 与 jnz 不相等跳转
  • 9.4 js 负数 跳转
  • 9.5 jns 正数 跳转
  • 9.6 jp[jpe] 偶 跳转
  • 9.7 jnp[jpo] 奇 跳转
  • 9.8 jo 溢出跳转
  • 9.9 jb 无符号 产生进位跳转
  • 9.9 jnb 未产生进位跳转
  • 9.9 jbe C和Z标志位跳转
  • 9.9 jnbe[ja] C和Z标志位跳转
  • 9.10 jl 有符号 S标志位跳转
  • 10 函数call指令
  • 11 循环类指令
  • 11.1 跳转实现
  • 11.2 loop指令
  • 12 寻址方式
  • 12.1 直接寻址
  • 12.2 间接寻址

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		最顶指向

popad作用则相反

2.3 pushfd 与 popfd

定义:是对标志位进行的现场保护

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

3 内存操作

3.1 mov指令

定义:对操作数进行赋值,操作数可以是寄存器、数值、间接寻址的内存数据。

mov eax,0x1
mov dword [44907D],1
mov al,dh
mov byte [449086],0xff

3.2 movsx 与 movzx

  • movsx:带符号扩展,并传送
  • movzx:无符号扩展,并传送
movsx eax,cx

movzx eax,cx

# 8位扩展到32位
movzx eax,ax

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式


汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

4 lea 指令

定义:去内存地址(非数据)

(需继续研究)

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

5 xchg 指令

定义:交换指令

与内存交换

xchg eax, [449080]

与寄存器交换

mov eax,0x1
mov ecx,0x2
xchg eax,ecx

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

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]

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

sub:减法指令,2个操作数相减,结果返回给第1个操作数。

mov eax,0x9
mov ecx,0x6
sub eax,ecx
sub ax,0x1

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

6.2 adc 与 sbb 指令

adc:与add不同的是,它需要额外加上cf进位标志位寄存器的值。

令 cf=1

mov eax,0x3
mov ecx,0x2
adc eax,ecx

结果:
eax=6
进位标志位:cf=0
奇偶标志位:pf=1

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

sbb:与sub不同的是,它需要额外减去cf进位标志寄存器的值。
令 cf=1

mov eax,0x3
mov ecx,0x2
sbb eax,ecx

结果:
eax=6
进位标志位:cf=0
奇偶标志位:pf=1

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

6.3 inc 与 dec 指令

inc:该指类似于 C语言中的 i++或者i=i+1。

mov eax,0x2
inc eax

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式


deg:递减

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

6.4 cdq、mul 与 div 指令

cdq:扩展,它是将eax扩展成 edx:eax

mul:乘法指令,对操作数进行乘法运算,结果放在eax,如果溢出则扩展存放到edx。

mov eax,0x2
mov ecx,0x3
mul ecx

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式


汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

mov eax,0x5
mov ecx,0x3
cdq
div ecx

div:除法指令,对操作数进行除法运算,根据多少位的寄存器而不同存放的商和余数的位置也不同。

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式


cl 低8位做除数,商在al存储,余数在ah存储。

mov eax,0x5
mov ecx,0x3
cdq
div cl

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

6.5 imul 与 idiv 指令

imul:也是乘法指令,却别在它有多个操作数,并且溢出直接舍去溢出的值。

操作数位3个的时候,第一个寄存器作为存储结果使用。

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式


idiv:跟imul一样,有多个操作数,丢弃溢出。

6.6 xadd 与 neg 指令

xadd:互换并相加指令,结果返回第1个操作数。

mov eax,0x2
mov ecx,0x3
xadd eax,ecx

xadd eax,ecx相当于

xchg eax,ecx
add eax,ecx

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

neg:指令取反指令。

mov eax, 6
neg eax

7 位运算指令

7.1 and 与

and为逻辑 与 运算,通过位运算得出结果。

  • 相同为1,不同为0(都为0则不变)
3   0011
5   0101
    0001

mov eax,0x3
mov ecx,0x5
and eax,ecx

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

7.2 or 或

or:逻辑 或 运算,通过位运算得出结果。

只要有1,则为1;2个都为0则为0

3   0011
5   0101
---------
7   0111	

mov eax,0x3
mov ecx,0x5
or eax,ecx

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

7.3 xor 异或

xor:逻辑异或运算,通过位运算得出结果。

  • 相同为0,不同为1。
3   0011
5   0101
---------
7   0110		6h

mov eax,0x3
mov ecx,0x5
xor eax,ecx

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

7.4 not 取反

not:逻辑取反运算,通过位运算得出结果。

  • 1则为0, 0则为1
3  0000 0000 0000 0000 0000 0000 0000 0011
---------
7  11111111111111111111111111111100

mov eax,0x3
not eax

8 比较指令

8.1 cmp 比较

cmp:比较指令,2个操作数,通常是比较2个值是否相等,影响标志位寄存器。

  • 结果为truw,zf(零标志位)为1,不同为0

与sub指令不同的是,cmp指令不存储结果。

mov eax, 0x1
mov ecx, 0x2
cmp eax,ecx

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				不跳转

9 跳转类指令

9.1 jmp 无条件跳转

jmp:无条件跳转,不根据标志位来改变程序逻辑。

jmp 00449087

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

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

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

9.3 jne 与 jnz 不相等跳转

定义:jne 与 jnz 根据 zf 标志位来进行跳转

  • zf=0,不相等 跳转
  • zf=1,相等 不跳转
mov eax,0x1
cmp eax,eax
jne short 0044908F

补充

jnz与je写到一起相当于无条件跳转jmp

mov eax,0x1
cmp eax,eax
jne 0044908F
je 0044908F

9.4 js 负数 跳转

定义:js如果结果为负数时,sf置1

  • sf=1 负数 跳转
  • sf=0 正数 不跳转
mov eax,0x1
mov ecx,0x2
cmp eax,ecx		1-2=-1
js 44908F    跳转

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

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为偶数个,跳转

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

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

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    跳转

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

9.9 jnb 未产生进位跳转

定义:2个操作数比较,第一个操作数 > 第二个操作数,CF置0

  • CF=0 跳转
  • CF=1 不跳转
mov eax,0x2
mov ecx,0x1
cmp eax,ecx		未产生借位,CF=0
jb 00449091     不跳转

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         实现跳转

10 函数call指令

类似于jmp指令,但它主要用于调用一个子程序或函数。

call 地址

retn

11 循环类指令

11.1 跳转实现

xor eax,eax
mov ecx,0x5
dec ecx
test ecx,ecx
jnz 00449087

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

11.2 loop指令

定义:根据寄存器 ECX值,递减直到为1时,不在继续循环。

xor edx,edx
mov ecx,0x5
inc edx
nop
nop
loopd 00449097

loopd:32位

loopw:16位

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

12 寻址方式

12.1 直接寻址

根据直接看到的指令干的什么,就是直接寻址

push 0x123456
mov eax,0x2
inc eax
dec ebx
mov ecx,0x3
add eax,0x5
push eax

12.2 间接寻址

肉眼看的话,不知道结果,通过CPU运行到此处,才能得出结果

汇编指令 栈现场保护 算数运算 位运算 比较指令 跳转指令 循环指令 寻址方式

参考地址:
https://www.bilibili.com/video/BV135411u7HR