C语言返回值为结构体的汇编分析
2012-11-12 11:27
489 查看
今天心血来潮,想弄清楚C语言的返回值为结构体,那它是怎么返回这些结构体的。
写了个简单的程序
#include <stdio.h>
struct abc
{
int a;
int b;
};
struct abc Ret()
{
struct abc temp;
temp.a = 1;
temp.b = 2;
return temp; //根据反汇编的结果,在这里已经把temp的内容复制到下面main里的temp1了
}
int main()
{
struct abc temp1;
temp1 = Ret(); //表面上应该在这里复制Ret函数里的值的,其实在上面的Ret函数还没有返回的时候这一个赋值已经做完了
printf("%d,%d\n", temp1.a, temp2.b);
}
temp1 = Ret(); 这一个语句里有一个玄机:
这个语句翻译成汇编之后和我们看到的C语言代码就不一样了,真实的情况是汇编之后这个语句被改变了,从反汇编之后的代码来看的话,这个语句变成了这样:
Ret(&temp1);
看见了吧,明明这个函数是没有参数的,结果temp1变量的地址作为参数传到了Ret函数里面去了。
写了个简单的程序
#include <stdio.h>
struct abc
{
int a;
int b;
};
struct abc Ret()
{
struct abc temp;
temp.a = 1;
temp.b = 2;
return temp; //根据反汇编的结果,在这里已经把temp的内容复制到下面main里的temp1了
}
int main()
{
struct abc temp1;
temp1 = Ret(); //表面上应该在这里复制Ret函数里的值的,其实在上面的Ret函数还没有返回的时候这一个赋值已经做完了
printf("%d,%d\n", temp1.a, temp2.b);
}
temp1 = Ret(); 这一个语句里有一个玄机:
这个语句翻译成汇编之后和我们看到的C语言代码就不一样了,真实的情况是汇编之后这个语句被改变了,从反汇编之后的代码来看的话,这个语句变成了这样:
Ret(&temp1);
看见了吧,明明这个函数是没有参数的,结果temp1变量的地址作为参数传到了Ret函数里面去了。
相关文章推荐
- Linux C函数入参和返回值是结构体时的汇编分析
- [C专家]分析C语言声明—— 关于结构体
- C语言下的结构体间赋值的深度分析
- C语言三种循环反汇编分析
- C语言 结构体传值与传址分析
- C语言内存中结构体对齐分析
- C语言直接返回结构体汇编后结果
- arm汇编进入C函数分析,C函数压栈,出栈,传参,返回值
- 深入分析C语言中结构体指针的定义与引用详解
- c语言编译、汇编、链接、执行过程分析
- Linux用GCC和GDB对C语言进行汇编语言分析
- C/C++函数返回值超过8-汇编分析
- 一段C语言和汇编的对应分析,揭示函数调用的本质
- 对C语言中结构体的测试分析
- C语言之Main函数返回值问题分析
- C 语言函数返回结构体汇编分析
- 逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式
- 一段C语言和汇编的对应分析,揭示函数调用的本质
- C语言之Main函数返回值问题分析
- 从汇编角度分析C语言的本质(一)