汇编看c之一,简单函数调用
简单的函数调用,通过简单的函数调用反汇编可以清楚了解如下
1.栈到底是什么,如何操纵栈的?
2.参数和临时变量是以什么形式在哪存放?
3.如何传递返回值?
举例:
#include <stdio.h>
int add(int a,int b)
{
int c=0;
c=a+b;
return c;
}
int main(void)
{
int x=0;
int y=3;
int z=4;
x=add(y,z);
return 0;
}
这是一个简单的通过调用函数计算两数之和的程序
VC6.0生成的汇编代码如下:
add函数
{
0040D750 push ebp
//把main函数的ebp压栈,ebp=1000,esp=896
0040D751 mov ebp,esp
//得到“新”栈基址,这里的新的意思是每个函数访问属于自己的一块栈区域,其实是相邻的内存区域,或者说栈只有一个。ebp=896,esp=896
0040D753 sub esp,44h
//ebp=896,esp=828
0040D756 push ebx
0040D757 push esi
0040D758 push edi
//ebp=896,esp=816
0040D759 lea edi,[ebp-44h]
0040D75C mov ecx,11h
0040D761 mov eax,0CCCCCCCCh
0040D766 rep stos dword ptr [edi]
//初始化内部变量区
5: int c=0;
0040D768 mov dword ptr [ebp-4],0
//c放入“新”栈基址
6: c=a+b;
0040D76F mov eax,dword ptr [ebp+8]
0040D772 add &n
相关文档:
第一次仔细地看这种代码,都是从网上复制做了略微改动后的产物。代码如下:
#include "reg52.h"
unsigned char Count;
sbit Xiang=P1^2 ; //蜂鸣器响
unsigned char code SONG[] ={
0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,
0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x2 ......
从小老师就教导我们,不会做的题就选C,因为选择题选C的概率是最高的。事实上真是如此吗?今天我突发奇想,利用Google做了一个小实验。统计显示,答案选C的题果然是最多的!
Results 1 - 10 of about 364,000 for "这道题选A".
Results 1 - 10 of about 352,000 for "这道题选B".
Results 1 - 10 of about 521,000 for ......
from:邹鑫的专栏
什么时候需要创建线程池呢?简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽视,这时也是线程池该出场的机会了。如果线程创建和销毁时间相比任务执行时间可以忽略不计,则没有必要使用线程池了。
&n ......
在C语言中,所有传递给函数的参数都是按值传递的。
#include <iostream>
using namespace std;
void Out(int* p)
{
int j = 11;
p = &j;
*p = 12;
cout<<*p<<endl;
}
int main(int argc,char*argv[])
{
&n ......