2

我正在尝试编译调用 c++ 函数的汇编代码。以及调用汇编代码的 c++ 代码。我在 Windows 7 中使用 Dev-C++4.9.9.2 和 nasm。有人可以告诉我如何编译以下代码,以便它们生成工作程序。这些代码取自讲义。

从汇编示例调用 C++

//C++ file
#include <iostream>
using std::cout;

void swap(int *p1, int *p2);
{
    int temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}

;NASM file    
extern _swap
x: dd 4
y: dd 7

push dword y
push dword x
call _swap
add esp, 8

从 C++ 示例调用程序集

;NASM file
global _swap
_swap:
    mov ecx, [esp+4]
    mov edx, [esp+8]
    mov eax, [ecx]
    xchg [ecx],eax
    ret


//C++ file
#include <iostream>
using std::cout;

void swap(int *p1, int *p2);

int main()
{
    int a = 10, b = 20;
    cout << "a=" << a << "b=" << b;
    swap(&a, &b);
    cout << "a=" << a << "b=" << b;
    system("PAUSE");
    return 0;   
}

此外,如果有人可以向我展示如何使用 Visual Studio 2010 C++ 和 NASM 编写相同的代码,那将非常有帮助。

4

1 回答 1

3

C++ 中的符号经过名称修饰。要使简单函数可以直接与外部代码链接,您需要(至少)将它们声明为extern "C"

extern "C" void swap(int *, int *)

您还需要确保调用约定匹配。(例如,我相信fastcall在 x86_64 上,在寄存器中传递整数参数,而不是在堆栈中。)

“外来函数接口”(ffi)库可以帮助简化这种跨语言互操作。

于 2013-06-30T22:38:56.743 回答