滴水复习 ---基础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:     }
if esle 汇编

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  
View Code

 本机尺寸 所以都是以4字节传递 32位

2.内存四区

 

 

 

posted @ 2023-05-15 21:58  大橘|博客  阅读(32)  评论(0)    收藏  举报