【问题标题】:C++ and Assembly Code (NASM) calling eachotherC++ 和汇编代码 (NASM) 相互调用
【发布时间】:2013-06-28 00:14:45
【问题描述】:

我正在尝试编译调用 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 编写相同的代码,那将非常有帮助。

【问题讨论】:

  • 代码现在在什么情况下不起作用?

标签: c++ visual-studio-2010 visual-c++ assembly nasm


【解决方案1】:

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

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

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

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

【讨论】:

  • 小说明:fastcall(或其变体)是 x86-64 的默认调用约定,而 IA-32 上的 fastcall 也在寄存器中传递前几个整数参数。跨度>
猜你喜欢
  • 2012-03-23
  • 2014-01-03
  • 2016-06-01
  • 1970-01-01
  • 2016-02-10
  • 2012-05-09
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多