本帖最后由 niucaidi 于 2021-7-10 14:22 编辑
用__declspec(naked)裸函数实现下面的功能
练习目的:
(1) 熟悉堆栈结构
(2) 参数、局部变量的位置
(3) 返回值存储的位置
int plus(int x,int y,int z)
{
int a = 2;
int b = 3;
int c = 4;
return x+y+z+a+b+c;
}
范例:
#include <stdio.h>
int __declspec(naked) plus(int x,int y,int z)
{
__asm
{
push ebp
mov ebp, esp
add esp, 0x40
push ebx
push esi
push edi
lea edi,dword ptr ss : [ebp-0x40]
mov eax,0xCCCCCCCC
mov ecx,0x10
rep stos dword ptr es : [edi]
mov dword ptr ss : [ebp - 0x4] , 2
mov dword ptr ss : [ebp - 0x8] , 3
mov dword ptr ss : [ebp - 0xC] , 4
mov eax,dword ptr ss:[ebp+0x8]
add eax,dword ptr ss:[ebp+0xC]
add eax,dword ptr ss : [ebp + 0x10]
add eax,dword ptr ss : [ebp - 0x4]
add eax,dword ptr ss : [ebp - 0x8]
add eax,dword ptr ss : [ebp - 0xC]
pop edi
pop esi
pop ebx
mov esp,ebp
pop ebp
ret
}
}
int main()
{
int x = 5;
int y = 6;
int z = 7;
printf("%d",plus(x,y,z));
return 0;
}
|