常用汇编指令
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