滴水复习 ---基础C(1)

内容
一.裸函数
1.调用约定

2.裸函数
什么是裸函数?
编译器不进行额外处理的函数
裸函数框架
1 void __declspec(naked) Function() 2 { 3 __asm 4 { 5 push ebp 6 mov ebp,esp 7 sub esp,0x40 8 push ebx 9 push esi 10 push edi 11 lea edi,dword ptr ds:[ebp-0x40] 12 mov eax,0xCCCCCCCC 13 mov ecx,0x10 14 rep stosd 15 16 pop edi 17 pop esi 18 pop ebx 19 mov esp,ebp 20 pop ebp 21 22 ret 23 } 24 }
int __declspec(naked) Function(int x,int y) { __asm { push ebp mov ebp,esp sub esp,0x40 push ebx push esi push edi lea edi,dword ptr ds:[ebp-0x40] mov eax,0xCCCCCCCC mov ecx,0x10 rep stosd mov eax,dword ptr ds:[ebp+8] add eax,dword ptr ds:[ebp+0xC] pop edi pop esi pop ebx mov esp,ebp pop ebp ret } }
int __declspec(naked) Function(int x,int y)
{
__asm
{
push ebp
mov ebp,esp
sub esp,0x40
push ebx
push esi
push edi
lea edi,dword ptr ds:[ebp-0x40]
mov eax,0xCCCCCCCC
mov ecx,0x10
rep stosd
mov dword ptr ds:[ebp-4],2
mov dword ptr ds:[ebp-8],3
mov eax,dword ptr ds:[ebp+8]
add eax,dword ptr ds:[ebp+0xC]
pop edi
pop esi
pop ebx
mov esp,ebp
pop ebp
ret
}
}
int _declspec(naked) Func(int x, int y) { _asm { push ebp mov ebp,esp sub esp,0x40 push ebx push esi push edi lea edi, dword ptr ds : [ebp - 0x40] mov eax,0xcccccccc mov ecx,0x10 rep stosd mov dword ptr ds:[ebp-4],2 mov dword ptr ds : [ebp - 8], 3 mov eax, dword ptr ds : [ebp + 8] add eax, dword ptr ds : [ebp + 0xC] pop edi pop esi pop ebx mov esp, ebp pop ebp ret 8 } } int main() { //printf("call00=%p call01=%p,call02=%p \n", c1, call2, call3); printf("%d", Func(2, 3)); getchar(); return 0; }
二.数据类型
1.整数
整数类型:char short int long
整数分为有符号和无符号
char cTest = 0xFF; unsigned char cuTest = 0xFF; printf("%d\n%d",cTest,cuTest);
2.浮点类型
浮点类型在计算机中的存储(省)
3.字符存储
中英文字符存储
char m = 'a'; //0x009AFE67 cccccc61
const char* mm = "我";
108: const char* mm = "我";
00BB46F1 mov dword ptr [ebp-2Ch],0BB7EA0h ->0000d2ce
4.编码规则
ascll编码

gb2312 (省)
三:C语言知识
1.数组(省)
2.逻辑判断if
if (true) 005446E5 mov eax,1 005446EA test eax,eax 005446EC je 005446F7 105: { 106: int c = 0x111; 005446EE mov dword ptr [ebp-8],111h 107: } 005446F5 jmp 005446FE 108: else 109: { 110: int c = 0x111; 005446F7 mov dword ptr [ebp-14h],111h 111: 112: }
3.循环组 汇编分析
for
while
do while
循环在汇编中来看就是一个条件判断然后来跳转进行的

4.局部变量分析
1.局部变量做参数
///压栈 00EB5A11 push 2 //m -[ebp+c] 00EB5A13 push 1 //mq[ebp+8] 00EB5A15 call 00EB14BA 00EB5A1A add esp,8 //寻参 103: int mz= mq; 00635955 mov eax,dword ptr [ebp+8] 00635958 mov dword ptr [ebp-8],eax 104: int mm = m; 0063595B mov eax,dword ptr [ebp+0Ch] 0063595E mov dword ptr [ebp-14h],eax
本机尺寸 所以都是以4字节传递 32位
2.内存四区


浙公网安备 33010602011771号