汇编基础2.2——堆栈及内存操作常用指令

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

猜你喜欢

转载自blog.csdn.net/Dugege007/article/details/108332088