niucaidi 发表于 2021-7-9 20:09

C语言基础第一课:初识C语言

本帖最后由 niucaidi 于 2021-7-9 20:17 编辑

## C语言第一课学习目标:
    1. 运行第一个C语言的程序
    2. 熟悉VC开发环境
    3. C函数的格式
    4. C函数的调用
    5. 函数的反汇编分析——空函数
    6. 函数的反汇编分析——简单功能
    7. 函数的反汇编分析——嵌套调用

------
### 运行第一个C语言的程序,熟悉VC开发环境
```C
    #include <stdio.h>//头文件

    int main()//程序入口点
    {
      printf("Hello Word!");
      return 0;
    }
```
------
### C函数的格式
1. 无参数、无返回值的函数格式
```c
   void 函数名()
   {
      
            //代码
   }
```
2. 有参数,无返回值的函数格式
```c
    void 函数名(参数类型 参数名,参数类型 参数名)
    {

             //代码
    }
```
3. 裸函数
```c
void __declspec(naked) Function()
{
            //此处可以无任何代码
}
```

4. 如何在C语言里写汇编
```c
void __declspec(naked) Function()
{
   //通过汇编写一个函数实现任意两个数相加
   __ASM
   {   

       //提升堆栈
       push ebp
       mov ebp,esp
       add esp,0x40

       //保护现场
       push ebx
       push esi
       push edi

       //填充溢出缓冲区
       mov ecx,0x10
       mov eax,0xCCCCCCCC
       lea edi,dword ptr ss:
       ret stos dword ptr es:

       //实现功能
       mov eax,dword ptr ss:
       add eax,dword ptr ss:

       //恢复现场
       pop edi
       pop esi
       pop ebx

       //恢复原始堆栈
       mov esp,ebp
       pop ebp

       //返回调用Call的下一行
       ret

       //平衡堆栈(假设传了两个参数)
       add esp,0x8
   }
}
```
-----
### 调用约定
| 调用约定   | 参数压栈顺序      | 平衡堆栈       |
| ---------- | --------------- | -------------- |
| __cdecl    | 从右至左入栈   | 调用者清理堆栈 |
| __stdcall| 从右至左入栈   | 自身清理堆栈   |
| __fastcall | ECX/EDX传递前两个参数,剩下的参数从右至左入栈 | 自身清理堆栈   |
**观察下列三个函数在汇编中参数是如何入栈的**
- 例1.
```c
int __cdecl plus1(int x,int y)
{
   return x+y;
}
```
- 例2.
```c
int __stdcall plus1(int x,int y)
{
   return x+y;
}
```
- 例3.
```c
int __fastcall plus1(int x,int y,int l,int k)
{
   return x+y+l+k;
}
```

niucaidi 发表于 2021-7-10 14:21

本帖最后由 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;                        
}                              
```                        
范例:
```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 :
                mov eax,0xCCCCCCCC
                mov ecx,0x10
                rep stos dword ptr es :
                mov dword ptr ss : , 2
                mov dword ptr ss : , 3
                mov dword ptr ss : , 4
                mov eax,dword ptr ss:
                add eax,dword ptr ss:
                add eax,dword ptr ss :
                add eax,dword ptr ss :
                add eax,dword ptr ss :
                add eax,dword ptr ss :
                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;
}
```

niucaidi 发表于 2021-7-9 20:45

tl;dr 发表于 2021-7-9 20:39
现在年轻人还愿意学c吗?

某个领导人说过,英语并不需要纳入义务教育,需要使用英语的人自然会去想办法学习的,我认为C语言也一样:lol

小能维尼 发表于 2021-7-9 23:31

一般C语言都作为入门的第一门语言课吧,就是学的精不精的问题了。
还有人把编程语言和人类文明语言相比,有很大的可比性吗?你连for,if是什么意思都不知道,还编锤子程序呢?
英语那是必学,而且要是精通,不然当韭菜都长不肥。不然最多就是比较老实无害。

wujl82 发表于 2021-7-10 11:14

感觉你这不是基础课:lol比较深入

无名氏wyw 发表于 2021-7-10 06:54

众所周知,C语言第一课讲汇编

人心所向 发表于 2021-7-9 20:20

不错,赞一个!

hgs1999313 发表于 2021-7-9 20:37

啊 保存了虽然一点都不懂

tl;dr 发表于 2021-7-9 20:39

浮华时年 发表于 2021-7-9 20:41

看不懂,感觉好难啊!

augue 发表于 2021-7-9 20:43

谢谢分享

闪闪闪 发表于 2021-7-9 20:47

谢谢分享

Ly_轮回 发表于 2021-7-9 20:51

看不懂汇编

wobensha 发表于 2021-7-9 20:52

正在学习
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: C语言基础第一课:初识C语言