鱼C论坛

 找回密码
 立即注册
查看: 4681|回复: 8

[技术交流] C语言,用参数作为返回值.让传递过去的参数也会发生改变

[复制链接]
发表于 2012-7-1 15:04:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
不知道C语言中,怎样让参数作为返回值

例如 add(a,b,c);

我想将 A的值和B的值相加 赋值给 C
然而 C 的值也会参数变化(不是在函数内变,而是传递这个参数的变量也会变)

而自己就研究了出来,反汇编看了一下
它参数传递是直接传递这个数值
mov eax,[ebp-0c]
push eax
所以.我传递参数的时候,改了一下,将 C 的值变成目前的EBP地址 (因为跳到另一个函数之后,EBP会发生改变)
然后,跳进ADD函数后,将 C 的值 视为地址 在传递过去。

#include <stdio.h>
//用参数作为返回值
void main()
{
        void add(int,int,int);
        int a,b,c;
        a=10;
        b=10;
        __asm mov dword ptr [c],ebp; //把当前EBP的值赋值给变量C  而变量C所在的地址就是 EBP-0C
        add(a,b,c);
        printf("%d\n",c);

}



void add(int x,int y,int z)
{
        int i;
        i=x+y;
        __asm mov ebx,[z];//将Z里面的EBP的地址给了 EBX
        __asm sub ebx,12; // 将EBX-12(十六进制:0C)   这样 EBX 就是指向变量C的地址
        __asm mov edi,[i]; //将结果存放在EDI
        __asm mov [ebx],edi;//将EDI的值赋值给了 DS:[EBX] 内
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-1 15:47:52 | 显示全部楼层
void add(int,int);
void main()
{
        
        int a,b,c;
        a=10;
        b=10;
     
        add(a,b);
               
        printf("%d\n",c);

}

void add(int x,int y)
{
        *((int *)*(&x-2) - 3) = x+y;
}
你那样很麻烦啊。。不晓得你要干嘛。。。不就是那么简单一个功能吗? 试试我的代码,一行搞定。。。第三个参数都没必要。。。还整那么多汇编。。。。我觉的学习汇编的作用是脑子里面想着汇编,键盘上敲着C,这才是境界,因为汇编能实现的,C也能实现。。。我觉得你应该能看懂我那一句代码,那一句才是C的精华。。。(还有,兄弟,最好把函数在全局声明,这是C语法规定的,尽管你在局部声明没错,但是。。。你以后会明白);
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-7-1 16:19:33 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-7-1 16:20:52 | 显示全部楼层
...:L 还是很难理解
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-1 16:33:40 | 显示全部楼层
Tzdner_C 发表于 2012-7-1 15:47
void add(int,int);
void main()
{

你这里的(&x-2) 是取 X 的地址 减去2 吗?
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-7-1 17:09:04 | 显示全部楼层
但是不理解为什么要-2- 3
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-1 17:50:20 | 显示全部楼层
ArcherJhon 发表于 2012-7-1 17:09
但是不理解为什么要-2- 3

:lol     这才是关键啊。。。若能看懂为什么要-2-3的话   你也就完全领悟了精华了。。。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-7-1 17:52:09 | 显示全部楼层
ArcherJhon 发表于 2012-7-1 16:20
... 还是很难理解

你还没学到指针,就领悟这么深啊。。。。很不错了。。。真的。。那你以后学指针应该会轻松很多
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-7-2 13:36:41 | 显示全部楼层
Tzdner_C 发表于 2012-7-1 17:52
你还没学到指针,就领悟这么深啊。。。。很不错了。。。真的。。那你以后学指针应该会轻松很多

。努力
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-30 04:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表