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

C函数返回结构体在汇编下的实现

 
编译器:vc++6.0(因为此种实现依赖编译器处理)
此处只简要叙述一下机制。并附部分关键指令序列。
准备:
1,关于EBP:称做栈基址指针。为什么这样说呢?我们先来看看函数调用的过程:
参数从右到左压栈。
call指令执行,该指令将导致EIP压栈。
每个函数前两句必定是:push ebp   mov ebp,esp。则call指令后,跳到被调函数出开始执行。保存ebp,即ebp压栈。
局部变量压栈。一般是sub esp,xxx的形式。
这就是将ebp称为基指针的原因:ebp-xx访问的时局部变量;ebp+xx访问的是参数。最左边参数地址是ebp+8h。ebp坐镇中间为基准。
2,函数返回值统一放入eax中。只要放得下。
3,栈扩展方向为从高地址到低地址。结构内的变量存贮方式:低地址对应声明顺序靠前的成员。一定要注意这里的区别!它关系到反汇编生成的代码里面的数字是怎么算出来的。但如果你自己写汇编代码就不用考虑这些了。只取成员名即可。
4,不能直接在两个存储器变量间用mov指令。
主要原理:
    当调用一个返回结构体的函数时,在vc++下,是这样处理:
    首先sub esp,xx,在堆栈上开辟一个空间。大小为结构体大小。
    然后lea eax,[esp-xx],即将结构体在堆栈中的地址送eax。
    push 参数。
    push eax。
    call 函数。
    被调用函数内部:
    routine:
    push ebp     mov ebp,esp
    一般是定义一个结构体局部变量:
    struct aa a;
    sub esp, sizeof aa
    然后处理结构体,
.
.
.
.
最后return a。
首先mov eax,[ebp+8h]      ;将外面的调用函数在堆栈内开辟的结构体指针赋予eax。
然后将被调用函数在堆栈内开辟的结构体内的值赋到调用函数开辟的结构体内。
一般形式是:mov ecx,[ebp-结构体大小]        ;赋第一个成员
                mov [eax],ecx
                mov ecx,[ebp-结构体大小+第一个成员大小(考虑对齐)]
  &nbs


相关文档:

C/C++招聘的一些感受和经验

C/C++招聘的一些感受和经验
前段时间刚参加了n多公司的C/C++软件工程师的面试,有国企,外企,私企(moto,飞思卡尔,港湾,中国卫星XXX(这个牛))等等等等。感受感想颇多,近日终于空闲,在此表述一下。
本人基本条件:3年开发经验,2year+ Windows development experence,1year+ Linux experence. 熟悉C,C++,MFC/ ......

我的C实践(1):宏的应用

    1、为了调用宏时能得到正确结果,在宏体中建议对宏的每个参数用括号括起来,并且当宏体是一个表达式时整个宏体也用括号括起来。
/* c1.c:将两个数相乘 */
#define product(x,y) ((x)*(y))
#include <stdio.h>
int main(){
int a=1,b=2,c=3,d=4,x=0;

x=product(a+3,b)+product(c,d); / ......

C/C++ assert() 函数用法

assert
函数名: assert
功  能: 测试一个条件并可能使程序终止
用  法: void assert(int test);
程序例:
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
struct ITEM {
   int&n ......

wince背光调节 VC代码c文件

// backlightDlg.cpp : implementation file
//
#include "stdafx.h"
#include "backlight.h"
#include "backlightDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CbacklightDlg dialog
CbacklightDlg::CbacklightDlg(CWnd* pParent /*=NULL*/)
 : CDialog(CbacklightDlg::IDD, pParent)
{
  ......

c标准库函数

本文包括大部分C标准库函数,但没有列出一些用途有限的函数以及某些可以简单的从其他函数合成的函数,也没有包含多字节和本地化函数。
标准库中的各个函数、类型以及宏分别在以下标准头文件中说明:
<assert.h> <float.h> <math.h> <stdarg.h> <stdlib.h>
<ctype.h> <limits.h& ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号