Visual Studio 2010 — C ++ и Assembly Code (NASM), вызывающие друг друга

Я пытаюсь скомпилировать ассемблерный код, который вызывает функцию C ++. И код C ++, который вызывает ассемблерный код. Я использую Dev-C ++ 4.9.9.2 и nasm в Windows 7. Может ли кто-нибудь показать мне, как скомпилировать следующие коды, чтобы они создавали работающие программы. Эти коды взяты из раздаточного материала лекции.

Вызов 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.

0

Решение

Символы в C ++ подвергаются название искажения. Чтобы сделать простые функции напрямую связанными с внешним кодом, вы должны объявить их (как минимум) как extern "C":

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

Вы также должны убедиться, что соглашения о вызовах совпадают. (Например, я считаю, что fastcall на x86_64 передает целочисленные аргументы в регистрах, а не в стеке.)

Библиотека «интерфейса с внешними функциями» (ffi) может помочь облегчить такого рода взаимодействие между языками.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]