主题:[讨论]C语言跟汇编,指点下新手
最近学了下汇编,然后老拿VC的disassembly看目标码,感觉像看到了C到底是怎样做的,蛮爽的感觉
打开VC
写个简单的程序:
int f(int a,int b)
{
int c=1;
return a+b/c;
}
int main(void)
{
int a=1;
f(a,100);
return 0;
}
编译,连接,然后进入debug,然后点disassembly看目标代码:
6: int main(void)
7: {
00401060 push ebp
00401061 mov ebp,esp //从这句知道ebp堆栈段基址是相对的
00401063 sub esp,44h //为什么开这么大的存储?
00401066 push ebx //为什么要保护ebx?这个寄存器有啥用?
00401067 push esi //同上
00401068 push edi //同上
00401069 lea edi,[ebp-44h]
0040106C mov ecx,11h
00401071 mov eax,0CCCCCCCCh //而且还全部初始化成这个值,WHY?
00401076 rep stos dword ptr [edi]
8: int a=1;
00401078 mov dword ptr [ebp-4],1
9: f(a,100);
0040107F push 64h
00401081 mov eax,dword ptr [ebp-4]
00401084 push eax //从这里看出是从右往左填参数
00401085 call @ILT+0(f) (00401005)
0040108A add esp,8
10: return 0;
0040108D xor eax,eax //从这句看,函数返回值放在eax,固定的吗?
11: }
0040108F pop edi
00401090 pop esi
00401091 pop ebx
00401092 add esp,44h
00401095 cmp ebp,esp
00401097 call __chkesp (004010b0)//这一句啥意思?
0040109C mov esp,ebp
0040109E pop ebp
0040109F ret
我对要保护的寄存器不太明白,感觉高级语言面向的是存储器,就算是register变量也只是推荐性,寄存器在程序员眼中是透明的,那所有的语句都是寄存器独立的,按理可以不用保护,除非有特殊用途.
打开VC
写个简单的程序:
int f(int a,int b)
{
int c=1;
return a+b/c;
}
int main(void)
{
int a=1;
f(a,100);
return 0;
}
编译,连接,然后进入debug,然后点disassembly看目标代码:
6: int main(void)
7: {
00401060 push ebp
00401061 mov ebp,esp //从这句知道ebp堆栈段基址是相对的
00401063 sub esp,44h //为什么开这么大的存储?
00401066 push ebx //为什么要保护ebx?这个寄存器有啥用?
00401067 push esi //同上
00401068 push edi //同上
00401069 lea edi,[ebp-44h]
0040106C mov ecx,11h
00401071 mov eax,0CCCCCCCCh //而且还全部初始化成这个值,WHY?
00401076 rep stos dword ptr [edi]
8: int a=1;
00401078 mov dword ptr [ebp-4],1
9: f(a,100);
0040107F push 64h
00401081 mov eax,dword ptr [ebp-4]
00401084 push eax //从这里看出是从右往左填参数
00401085 call @ILT+0(f) (00401005)
0040108A add esp,8
10: return 0;
0040108D xor eax,eax //从这句看,函数返回值放在eax,固定的吗?
11: }
0040108F pop edi
00401090 pop esi
00401091 pop ebx
00401092 add esp,44h
00401095 cmp ebp,esp
00401097 call __chkesp (004010b0)//这一句啥意思?
0040109C mov esp,ebp
0040109E pop ebp
0040109F ret
我对要保护的寄存器不太明白,感觉高级语言面向的是存储器,就算是register变量也只是推荐性,寄存器在程序员眼中是透明的,那所有的语句都是寄存器独立的,按理可以不用保护,除非有特殊用途.