首页
社区
课程
招聘
[求助]C语言内联汇编如何定义返回?
2007-1-17 23:35 7577

[求助]C语言内联汇编如何定义返回?

2007-1-17 23:35
7577
请问如何解决 2 warning(s) 这个问题?

int add(int,int);
int sub(int,int);
这两个函数无法用 void 类型,如果用 int 类型那么没办法 return ,不 return的话程序可以正常运行,但是下面的2个警告怎么解决?我想知道能使这个程序完美的方法。

#include <iostream>

using namespace std;

int add(int,int);
int sub(int,int);

int main()
{
int a,b;
cout<<"Pleash input a and b:"<<endl;
cin>>a>>b;
cout<<"A-B="<<sub(a,b)<<endl;
cout<<"A+B="<<add(a,b)<<endl;
return 0;
}

int sub(int a,int b)
{
__asm
{
mov eax,a
sub eax,b
}
}

int add(int a, int b)
{
__asm
{
mov eax,a
add eax,b
}
}

D:\C++\Test\Test.cpp(25) : warning C4035: 'sub' : no return value
D:\C++\Test\Test.cpp(34) : warning C4035: 'add' : no return value

Test.obj - 0 error(s), 2 warning(s)

[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞7
打赏
分享
最新回复 (13)
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
GoogleDX 2007-1-18 09:49
2
0
VC 2003好像没有这个提示。

最丑陋的办法是#pragma warning (disable:4035)

不想用这个可以再包装一层:
void __inline __declspec(naked) __stdcall add_wrapper()
{
    __asm
    {
        mov eax, dword ptr[esp + 4]
        add eax, dword ptr[esp + 8]
        ret 8
    }
}

int add(int a, int b)
{
    int val(0) ;
    __asm
    {
        push b
        push a
        call add_wrapper
        mov  val, eax
    }

    return val ;
}

VC也应该提供了屏蔽这个Warning的函数属性,但是我没找到。
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dwing 1 2007-1-18 11:34
3
0
最初由 GoogleDX 发布
VC 2003好像没有这个提示。

最丑陋的办法是#pragma warning (disable:4035)

不想用这个可以再包装一层:
........


naked call 即使是 __forceinline, 编译器也不会给你内联的.
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
GoogleDX 2007-1-18 12:25
4
0
最初由 dwing 发布
naked call 即使是 __forceinline, 编译器也不会给你内联的.


不知道VC里面还有这个说法,我的程序里面都是Inline一些不是很长的naked函数,都是可以内联进去的。
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dwing 1 2007-1-18 18:57
5
0
最初由 GoogleDX 发布
不知道VC里面还有这个说法,我的程序里面都是Inline一些不是很长的naked函数,都是可以内联进去的。


你反汇编看看就知道了,VC6和VC2003都不内联naked函数.
因为编译器对内嵌的汇编代码是完全不做改动的(尊重"汇编高手"?),包括最后的ret,都内联进去程序会crash的.
雪    币: 243
活跃值: (11)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
edisonH 3 2007-1-18 22:03
6
0
米办法,费事点

int sub(int a,int b)
{
int _eax;
__asm
{
mov eax,a
sub eax,b
mov _eax,eax
}
return _eax;
}
这样就米有warning了
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
dwing 1 2007-1-19 17:29
7
0
最初由 edisonH 发布
米办法,费事点
int sub(int a,int b)
{
int _eax;
__asm
{
mov eax,a
sub eax,b
mov _eax,eax
}
return _eax;
}
这样就米有warning了

还不如用#pragma warning(disable:4035),至少代码看上去不那么别扭.
雪    币: 191
活跃值: (335)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
RegKiller 10 2007-1-20 15:32
8
0
6楼的办法不错,比较适合于初学者用于理解,而不是简单的屏蔽掉警告。 我喜欢这个,虽然代码执行效率下降了。
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
busy 2007-1-21 15:42
9
0
使用 #pragma warning(disable:4035) 这是个简单易行的方法
不过最好就是搞完这个后再次打开4035:
#pragma warning(disable:4035)
//你的一些会有4035警告的代码
... ...
#pragma warning(default:4035)
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zzsx 2007-1-24 04:16
10
0
将返回值存在a里

int sub(int a,int b)
{
__asm
{
mov eax,b
sub a,eax
}
return a;
}
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
heXer 3 2007-1-24 09:32
11
0
楼上的方法还不错啊
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhougz 2007-2-8 11:00
12
0
最初由 zzsx 发布
将返回值存在a里

int sub(int a,int b)
{
__asm
........


这位老兄的代码很有创意!
雪    币: 161
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
PFC 2007-2-8 13:10
13
0
写程序难免有些(警告)可以收到预期效果就OK了。
还有你可以在编译器选项里面将编译警告去掉。
这样什么警告你将也不会看到了。

强调一点不要将函数名与汇编指令取相同名字。
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
AsmCCPlus 2007-2-12 18:18
14
0
int add(int,int);
int sub(int,int);

int sub(int a,int b)
{
__asm
{
mov eax,a
sub eax,b
}
}

int add(int a, int b)
{
__asm
{
mov eax,a
add eax,b
}
}

D:\C++\Test\Test.cpp(25) : warning C4035: 'sub' : no return value
D:\C++\Test\Test.cpp(34) : warning C4035: 'add' : no return value

Test.obj - 0 error(s), 2 warning(s)

看下你的函数原型就应该知道了..函数需要返回值....
而你就跟本没有返回任何类..所以就提示没有返回值了..

6楼的是一种很好的解决方法...如果要在汇编代码中返回就考虑,,语言的调用约定了...
游客
登录 | 注册 方可回帖
返回