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