【发布时间】:2012-11-17 08:49:01
【问题描述】:
我尝试在 VS2005 中将 C++ 工具移植到 x64。问题是,代码包含内联汇编,64 位编译器不支持。我的问题是,如果有更多的努力来用清晰的 c++ 编码或使用内在函数。但在这种情况下,并非所有汇编函数都可用于 x64,对吗?比方说,我有一个简单的程序
#include <stdio.h>
void main()
{
int a = 5;
int b = 3;
int res = 0;
_asm
{
mov eax,a
add eax,b
mov res,eax
}
printf("%d + %d = %d\n", a, b, res);
}
我必须如何使用内在函数更改此代码才能运行它?我是汇编程序新手,不了解它的大部分功能。
更新:
我按照 Hans 的建议进行了更改以使用 ml64.exe 编译程序集。
; add.asm
; ASM function called from C++
.code
;---------------------------------------------
AddInt PROC,
a:DWORD, ; receives an integer
b:DWORD ; receives an integer
; Returns: sum of a and b, in EAX.
;----------------------------------------------
mov eax,a
add eax,b
ret
AddInt ENDP
END
main.cpp
#include <stdio.h>
extern "C" int AddInt(int a, int b);
void main()
{
int a = 5;
int b = 3;
int res = AddInt(a,b);
printf("%d + %d = %d\n", a, b, res);
}
但结果不正确5 + 3 = -1717986920。我想,指针出了点问题。我哪里做错了?
【问题讨论】:
-
这个例子是典型的你的问题还是只是你问题的一个非常简单的例子?我会尽力删除汇编程序并用 C/C++ 替换它。对于几乎所有示例,性能都相当(可能更好,因为现代 C 编译器比人类聪明得多)
-
在我的项目中有很多组装零件,所以这是一个普遍的问题
-
内在函数不包含任何 C 编译器都可以生成的普通指令。只有 SSEx 集中的特殊说明。您需要一个用于此代码的汇编程序 ml64.exe
-
您链接汇编器生成的 .obj 文件。不,它不再是内联的。
-
@HansPassant 让您的评论成为答案。我认为没有更好的选择。
标签: c++ visual-c++ 64-bit inline-assembly intrinsics