汇编_常用指令

常用汇编指令

word ptr 与 byte ptr

  • word ptr指明了指令访问的内存单元是一个字单元。
  • byte ptr指明了指令访问的内存单元是一个字节单元。
  • dword ptr指令访问的内存单元是一个双字单元。
    在这里插入图片描述

push

例如下面这段汇编指令

_main:
   push   3
   push   2

第一行_main,会创建一个main帧

第二行push 3,会将esp寄存器里的地址减去四个字节,然后将3存入该地址

第三行push 2,会将esp寄存器里的地址再减去四个字节,然后将2存入该地址

汇编_常用指令_第1张图片
push指令干了哪些事

1.esp-4
2.把push后面的内容存储到当前esp指向的内存中

call 指令

_main:
	call   _add_a_and_b

首先会创建一个mian帧,在里面存放main函数的数据

然后执行call _add_a_and_b时,会继续为add_a_and_b创建一个帧,用于存放它的数据,add_a_and_b执行结束后,会删除该帧
汇编_常用指令_第2张图片

mov 指令

将一个数据从源地址传送到目标地址

mov <目的地址><源地址>

例如mov EAX,1,将1写入EAX
汇编_常用指令_第3张图片

add 指令

add指令用于将两个运算子相加,并将结果写入第一个运算子。

mov eax,1
mov ecx,2
add eax,ecx

运行前,eax=1,ecx=2
汇编_常用指令_第4张图片
运行后,eax=3
在这里插入图片描述

pop 指令

pop指令用于取出 Stack 最近一个写入的值,也就是ESP地址(即最低位地址的值),并将这个值写入运算子指定的位置。
汇编_常用指令_第5张图片汇编_常用指令_第6张图片

例子:

push 5
push 4
push 3
push 2
push 1
pop eax
pop eax
pop eax
pop eax
pop eax

执行至push 1时
汇编_常用指令_第7张图片
执行pop eax,此时stack底为1,被取出给eax,同时esp寄存器的值加4,即回收4个字节。

汇编_常用指令_第8张图片
汇编_常用指令_第9张图片

再次执行pop eax,此时栈底为2,被取出给eax,同时esp寄存器的值加4,即回收4个字节。
汇编_常用指令_第10张图片汇编_常用指令_第11张图片

后面同理

ret 指令

ret指令用于终止当前函数的执行,将运行权交还给上层函数。也就是,当前函数的帧将被回收。

_add_a_and_b:
   push   5
   ret  
_main:
   push   3
   push   2
   call   _add_a_and_b 
   ret

执行到push 5时,add_a_and_b帧被创建,并在该帧里放入了5
汇编_常用指令_第12张图片
此时执行ret,add_a_and_b函数终止执行,系统就回到刚才main函数中断的地方,继续往下执行。
汇编_常用指令_第13张图片
最后执行main函数的ret,main函数运行结束,ret指令退出程序执行。
汇编_常用指令_第14张图片

修改EIP

修改通用寄存器可以用mov指令,但是无法修改eip

因为EIP存放的是CPU下一次要执行的指令的地址,但是有三个指令,可以修改掉他,分别是JMP、CALL、RET

JMP

无条件跳转。修改EIP,且只影响EIP。内存/立即数/寄存器,都可以操作

jmp short 006a0231

汇编_常用指令_第15张图片

你可能感兴趣的:(二进制逆向,汇编,逆向,二进制)