| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 353 人关注过本帖
标题:对函数和指针都不熟悉,哪位给改动改动
只看楼主 加入收藏
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
结帖率:99.76%
收藏
已结贴  问题点数:20 回复次数:9 
对函数和指针都不熟悉,哪位给改动改动
程序代码:
#include <stdio.h>
#include <windows.h>
//要求1、请不要改动我的主体思路
//要求2、把第三个参数变成普通变量或者指针变量
//目的:测试形参向主程序递交返回值
DWORD _mul(DWORD a,DWORD b,DWORD c[])   //这里用数组向主程序传值
{
    DWORD rets=0;
    DWORD tmp=0;
    _asm
    {
        xor edx,edx;
        mov eax,a;
        mov ebx,b;
        cdq;
        imul ebx;
        mov rets,eax;
        mov tmp,edx;
    }
    c[0]=tmp;     //这里向主程序返回乘积的高32位
    return rets;  //这里向主程序返回乘积的低32位
}
int main()
{
    DWORD l32=0;
    DWORD h32[1]={0};
    l32=_mul(10000000,10000000,h32);
    printf("%X%X\n",h32[0],l32);   //这里输出1000万的平方的结果5AF3107A4000
    return 0;
}
2012-12-08 09:16
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:20 
#include <stdio.h>
#include <windows.h>
 //要求1、请不要改动我的主体思路
 //要求2、把第三个参数变成普通变量或者指针变量
 //目的:测试形参向主程序递交返回值
 DWORD _mul(DWORD a,DWORD b,DWORD *pdwHight/*c[]*/)   //这里用数组向主程序传值
 {
     DWORD rets=0;
     DWORD tmp=0;
     _asm
     {
         xor edx,edx;
         mov eax,a;
         mov ebx,b;
         cdq;
         imul ebx;
         mov rets,eax;
         mov tmp,edx;
     }
     *pdwHight=tmp;     //这里向主程序返回乘积的高32位
     return rets;  //这里向主程序返回乘积的低32位
 }
 int main()
 {
     DWORD l32=0;
     DWORD h32 = 0;//[1]={0};
     l32=_mul(10000000,10000000,&h32);
     printf("%X%X\n",h32,l32);   //这里输出1000万的平方的结果5AF3107A4000
     return 0;
 }

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2012-12-08 09:35
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
还是需要那个临时变量  这种方法我都用过  只是子函数中没有用那个临时变量
晕,主程序传的是变量h32的地址(这样就避免了变量生存期的问题)而子函数就是向那个地址写数据

DO IT YOURSELF !
2012-12-08 09:39
crystall
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:184
专家分:809
注 册:2012-12-1
收藏
得分:0 
程序代码:
#include "stdafx.h"
#include <windows.h>
//要求1、请不要改动我的主体思路
//要求2、把第三个参数变成普通变量或者指针变量
//目的:测试形参向主程序递交返回值
DWORD _mul(DWORD a,DWORD b,DWORD& c)   //这里用数组向主程序传值
{
    DWORD rets=0;
    DWORD tmp=0;
    _asm
    {
        xor edx,edx;
        mov eax,a;
        mov ebx,b;
        cdq;
        imul ebx;
        mov rets,eax;
        mov tmp,edx;
    }
    c=tmp;             //这里向主程序返回乘积的高32位
    return rets;     //这里向主程序返回乘积的低32位
}

int main()
{
    DWORD l32 = 0;
    DWORD h32 = 0;
    l32=_mul(10000000,10000000, h32);
    printf("%X%X\n", h32, l32);   //这里输出1000万的平方的结果5AF3107A4000
    return 0;
}
2012-12-08 09:56
Alar30
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:10
帖 子:988
专家分:1627
注 册:2009-9-8
收藏
得分:0 
来膜拜一下哈。。。
2012-12-08 10:04
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用Alar30在2012-12-8 10:04:00的发言:

来膜拜一下哈。。。
不会吧  这也膜拜

DO IT YOURSELF !
2012-12-08 10:10
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
DWORD _mul(DWORD a,DWORD b,DWORD *pdwHight/*c[]*/)   //这里用数组向主程序传值
{     
    _asm
      {
          xor edx,edx;
          mov eax,a;
          mov ebx,b;
          cdq;
          imul ebx;
          push eax;
          mov eax, pdwHight;
          mov [eax], edx;
          pop eax;
      }
}

一个临时变量都不要

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2012-12-08 10:26
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
上面代码用release版本测试好点,debug版本可能被编译器嵌入大量汇编代码不知道有没有干扰

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2012-12-08 10:29
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用yuccn在2012-12-8 10:26:32的发言:

DWORD _mul(DWORD a,DWORD b,DWORD *pdwHight/*c[]*/)   //这里用数组向主程序传值
{     
    _asm
      {
          xor edx,edx;
          mov eax,a;
          mov ebx,b;
          cdq;
          imul ebx;
          push eax;
          mov eax, pdwHight;
          mov [eax], edx;
          pop eax;
      }
}

一个临时变量都不要
恩 这个比较好,不过会有一个函数无返回值的警告,虽然我们知道eax已经返回了,但是编译器不知道

DO IT YOURSELF !
2012-12-08 10:30
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用yuccn在2012-12-8 10:29:20的发言:

上面代码用release版本测试好点,debug版本可能被编译器嵌入大量汇编代码不知道有没有干扰
反正我测试没问题

DO IT YOURSELF !
2012-12-08 10:31
快速回复:对函数和指针都不熟悉,哪位给改动改动
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032178 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved