三、常用的汇编指令
常用的汇编指令:
push :把一个32位的操作数压入堆栈中。这个操作导致esp被减4.esp被形象地称为栈顶。我们认为顶部地址是地址小的区域,那么,
压入堆栈的数据越多,这个堆栈也就越堆越高,esp也就越来越小。在32位平台上,esp每次减少4(字节)。
pop :相反,esp被加4,一个数据出栈。pop的参数一般是一个寄存器,栈顶的数据被弹出到这个寄存器中。
一般不会把sub、add这样的算术指令,以及call、ret这样的跳转指令归入堆栈相关指令中。但实际上在函数参数传递过程中,sub和add最常用来操作
堆栈;call和ret对堆栈也有影响。所以这里作为特殊处理。
sub :减法。格式为:sub 被减数,减数
add :加法。格式与sub类似。
ret :返回。实际返回地址是当前call对应的下一行代码,这个返回的地址一般会在call执行时被压入堆栈。
call:调用函数。
1 call的本质相当于push+jmp ret的本质相当于pop+jmp
如果需要在堆栈中分配4个4字节长整型的空间,则用esp减去4*4=16即可。
同时,也可以用add来恢复。常用于分配函数局部变量空间。
mov 数据移动指令,或者说数据复制命令。
用法是 mov 移到哪(到哪去),移动谁(从哪来)
xor 异或指令,通常用于代替mov eax,0
lea指令
lea edi,[ebp-0cch] 表示将[ebp-0cch]数据单元对应的内容赋值给edi
不过,lea取的是地址,也就是说,相当于mov edi,ebp-0cch(注意,这条指令是不能被执行的,这里只是用来作说明而已)
stos指令:
先来看看上次实验的代码
1 mov ecx,30h 2 mov eax,0ccccccch 3 rep stos dword ptr es:[edi]
stos是串存储指令,它的功能是将eax中的数据放入edi所指的地址中(edi中内容为地址),同时,edi会增加4字节数(dword表示4字节),执行到ecx的值为零为止。这里的stos其实是stosd,对应的还有stosb、stosw,分别对应处理4、1、2个字节,这里对堆栈中30*4(0c0h)个字节初始化为0cch(也就是int3指令的机器码),这样发生意外时执行堆栈里面的内容会引发调试中断。
jmp 无条件跳转,有去无回
jg 大于时跳转
gl 小于是跳转
jge 大于等于时跳转
cmp 比较(相减比较)