PUSH指令
向堆栈中压入数据
修改栈顶指针ESP寄存器
使用PUSH指令可向堆栈中依次存入数据
//r:通用寄存器,r8表示8位通用寄存器
//m:内存,m8表示8位内存
//imm:立即数,imm8表示8位立即数
PUSH r32 //将 32位通用寄存器 压入堆栈
PUSH r16 //...
PUSH m32
PUSH m16
PUSH imm32
PUSH imm16
PUSH imm8
//相当于
MOV DWORD PTR DS:[18FF88],1 //将值存入堆栈中
SUB ESP,4 //将ESP-4
注:指令用法可在Inter白皮书查阅
POP指令
将栈顶数据存储到寄存器或内存中
修改栈顶指针ESP寄存器
使用POP指令可将堆栈顶数据取出,并将栈顶位置前移
//r:通用寄存器,r8表示8位通用寄存器
//m:内存,m8表示8位内存
//imm:立即数,imm8表示8位立即数
POP r32
POP r16
POP m32
POP m16
//相当于
MOV ECX,DWORD PTR DS:[ESP] //将栈顶数据取出
ADD ESP,4 //将ESP+4
JMP指令
修改EIP寄存器(储存CPU下次运行内存的地址)中的值
JMP r32
JMP m32
JMP imm
//相当于
MOV EIP,r32 //实际无法使用MOV修改EIP中的值,这里只是打个比方
MOV EIP,m32
MOV EIP,imm
CALL指令
修改EIP寄存器中的值
将跳转前的指令地址的下一条地址压入堆栈中,并将ESP-4
CALL r32
CALL m32
CALL imm
注:与JMP指令唯一区别是,在堆栈中存储CALL指令下一行的地址
RET指令
把当前栈顶中的值放入EIP中,并将ESP+4
RET
//相当于
ADD ESP,4
MOV EIP,[ESP-4] //实际无法使用MOV修改EIP中的值,这里只是打个比方
相加函数示例
int plus(int x,int y)
{
push ebp
mov ebp,esp
sub esp,40h
push ebx
push esi
push edi
lea edi,[ebp-40h]
mov ecx,10h
mov eax,0CCCCCCCCh
rep stos dword ptr [edi]
return 0;
xor eax,eax
}
pop edi
pop esi
pop ebx
mov esp,ebp
pop ebp
ret