易截截图软件、单文件、免安装、纯绿色、仅160KB

汇编看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


相关文档:

C语言的一个简单算法: 26个字母随机步生成

一个简单的小程序, 原题目见<C语言程序设计-现代方法>第八章练习13.
由于自己只看到第八章, 所以, 不敢贸然使用函数等其他内容, 高手请放声大笑.
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROWS 10
#define COLS 10
/**
* @author: selfimpr
* @blog: http:// ......

综合运用C语言指针强制转换和回调函数


  
在这个例子里,回调函数比较两个值。查找函数向比较函数传递两个指向需要进行比较的值的指针,并检查比较函数的返回值。例如:零表示相等的值,现在查找函
数就与类型无关,因为它本身并不执行实际的比较。确实,调用者必须编写必需的比较函数,但这样做是很容易的,因为调用者知道链表中所包含的值的类型 ......

C++如何调用delphi制作的dll


一、概述及示例代码
Delphi中包括许多已经封装好的类及控件,其中的非可视化控件库以功能方式划分可处理诸多应用需求。若使用C++实现系统时对某些功能简单调用delphi中现成的库时即可。因此将delphi中的库以DLL形式封装好之后如何将方法导出可供C++调用是本文记录的重点。C++调用的方式有多种,在这里只讨论一种静 ......

一个Linux下C线程池的实现

from:邹鑫的专栏
    什么时候需要创建线程池呢?简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽视,这时也是线程池该出场的机会了。如果线程创建和销毁时间相比任务执行时间可以忽略不计,则没有必要使用线程池了。
  &n ......

c函数的参数传递

在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 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号