如何在C ++中使用内在函数进行内联汇编?

时间:2012-11-29 09:56:32

标签: c++ visual-c++ 64-bit inline-assembly intrinsics

我尝试在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。我猜,指针出了问题。我在哪里犯了错误?

1 个答案:

答案 0 :(得分:2)

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

关于非内联代码中的错误,首先看一下代码似乎没问题。我会看一下C ++生成的汇编代码 - 看它是否与addInt程序匹配。

修改:需要注意的两件事:

  1. extern addInt :proc添加到您的asm代码中。
  2. 我不知道程序接受参数的汇编语法。参数通常根据您的调用约定通过堆栈指针(sp寄存器)提取,请参阅此处:http://courses.engr.illinois.edu/ece390/books/labmanual/c-prog-mixing.html