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

本文简要介绍了VC++6.0编译器处理C函数返回结构体的方式。在函数调用时,结构体会在堆栈上开辟空间,并通过lea指令获取其地址。函数内部通过mov指令将结构体成员的值复制到调用者分配的空间中,最后通过return返回结构体指针。这种处理方式涉及到栈操作、结构体成员的存储顺序以及效率问题。
摘要由CSDN通过智能技术生成
 

编译器: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 函数。

   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值