常用汇编指令

word ptr 与 byte ptr

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

例如int a = 3;的汇编代码就是mov dword ptr [a],3,将3存储在变量a的地址上。
注:

  • [a]:这是一个内存引用,指向变量a所在的内存地址。
  • int占4个字节,所以是dword ptr指令

push

例如下面这段汇编指令

_main:
   push   3
   push   2

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

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

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

在这里插入图片描述
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执行结束后,会删除该帧
在这里插入图片描述

mov 指令

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

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

例如mov EAX,1,将1写入EAX
在这里插入图片描述

add 指令

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

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

运行前,eax=1,ecx=2
在这里插入图片描述
运行后,eax=3
在这里插入图片描述

pop 指令

pop指令用于取出 Stack 最近一个写入的值,也就是ESP地址(即最低位地址的值),并将这个值写入运算子指定的位置。
在这里插入图片描述在这里插入图片描述

例子:

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

执行至push 1时
在这里插入图片描述
执行pop eax,此时stack底为1,被取出给eax,同时esp寄存器的值加4,即回收4个字节。

在这里插入图片描述
在这里插入图片描述

再次执行pop eax,此时栈底为2,被取出给eax,同时esp寄存器的值加4,即回收4个字节。
在这里插入图片描述在这里插入图片描述

后面同理

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
在这里插入图片描述
此时执行ret,add_a_and_b函数终止执行,系统就回到刚才main函数中断的地方,继续往下执行。
在这里插入图片描述
最后执行main函数的ret,main函数运行结束,ret指令退出程序执行。
在这里插入图片描述

修改EIP

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

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

JMP

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

jmp short 006a0231

在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐