我尝试在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);
}
如何使用内在函数更改此代码来运行它?我是汇编程序的新手,并且不了解它的大部分功能。
更新
我修改了使用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
。我猜,指针出了问题。我在哪里犯了错误?
答案 0 :(得分:2)
VC中的64位目标不支持内联汇编。
关于非内联代码中的错误,首先看一下代码似乎没问题。我会看一下C ++生成的汇编代码 - 看它是否与addInt
程序匹配。
修改:需要注意的两件事:
extern addInt :proc
添加到您的asm代码中。sp
寄存器)提取,请参阅此处:http://courses.engr.illinois.edu/ece390/books/labmanual/c-prog-mixing.html