C/C++/VC6/VS之间的关系
- C\C++是编程语言,C++是由C而来的,是上下兼容的。
- VC/VS是Windows下的集成开发环境。
- VC6有利于我们去了解程序代码背后的东西,看它的汇编代码、堆栈执行等。
第一个C程序
- 创建项目
- 创建文件
- 入口程序
- 构建(F7)
- 向程序中写汇编指令,使用__asm{} 开头来写
重新构建,F5运行就保存了
- 在VC6里按F9下断点,运行后可以对程序进行反汇编
右键Go to …就成功来到反汇编窗口了
什么是函数
函数就是一系列指令的集合,为了完成某个重复使用的特定功能
C语言中的函数格式如下:
返回类型 函数名(参数列表)
{
}
这里有一下几点主要注意:
- 返回类型、函数名不可省略。
- 参数列表可以省略。
函数名、参数名的命名规则:
- 只能以字母、数字、下划线组成,并且第一个字母必须是字母或下划线。
- 区分大小写
- 不能使用C语言的关键字
例如:
int plus(int x,int y)
{
return 0;
}
调用函数
汇编中的函数调用
push 1
push 2
call 内存地址
......
ret
或者
mov eax,参数1
mov ebx,参数2
call 内存地址
.....
ret
在C语音里,我们直接调用定义的函数名就可以了,例如:
int function(int x,int y) //定义函数
{
return 0;
}
void main()
{
function(1,2); //调用函数
}
我们还可以看一看调用这个函数他在汇编中都干了什么
这个调用在汇编里我们能够看的一清二楚,无非就是两次压栈,调用了一个CALL,因为传了两个参数所以栈顶指针ESP的值+8。
要想了解函数,一定要背过下面这串汇编:
5: //定义函数
6: int function(int x,int y)
7: {
00401020 push ebp
00401021 mov ebp,esp
00401023 sub esp,40h
00401026 push ebx
00401027 push esi
00401028 push edi
00401029 lea edi,[ebp-40h]
0040102C mov ecx,10h
00401031 mov eax,0CCCCCCCCh
00401036 rep stos dword ptr [edi]
8:
9: return 0;
00401038 xor eax,eax
10:
11: }
0040103A pop edi
0040103B pop esi
0040103C pop ebx
0040103D mov esp,ebp
0040103F pop ebp
00401040 ret