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: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;
}
``` tl;dr 发表于 2021-7-9 20:39
现在年轻人还愿意学c吗?
某个领导人说过,英语并不需要纳入义务教育,需要使用英语的人自然会去想办法学习的,我认为C语言也一样:lol 一般C语言都作为入门的第一门语言课吧,就是学的精不精的问题了。
还有人把编程语言和人类文明语言相比,有很大的可比性吗?你连for,if是什么意思都不知道,还编锤子程序呢?
英语那是必学,而且要是精通,不然当韭菜都长不肥。不然最多就是比较老实无害。 感觉你这不是基础课:lol比较深入 众所周知,C语言第一课讲汇编 不错,赞一个! 啊 保存了虽然一点都不懂 看不懂,感觉好难啊! 谢谢分享 谢谢分享 看不懂汇编 正在学习