1

我尝试在 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 

主文件

#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。我想,指针出了点问题。我在哪里做错了?

4

1 回答 1

2

VC 中的 64 位目标不支持内联汇编。

关于非内联代码中的错误,乍一看,代码似乎很好。我会查看从 C++ 生成的汇编代码 - 看看它是否与addInt程序匹配。

编辑:需要注意的两件事:

  1. 添加extern addInt :proc到您的 asm 代码。
  2. 我不知道过程接受参数的汇编语法。参数通常sp根据您的调用约定通过堆栈指针(寄存器)提取,在此处查看更多信息:http: //courses.engr.illinois.edu/ece390/books/labmanual/c-prog-mixing.html
于 2012-11-30T10:09:07.723 回答