Я пытаюсь скомпилировать ассемблерный код, который вызывает функцию 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.
Символы в C ++ подвергаются название искажения. Чтобы сделать простые функции напрямую связанными с внешним кодом, вы должны объявить их (как минимум) как extern "C"
:
extern "C" void swap(int *, int *)
Вы также должны убедиться, что соглашения о вызовах совпадают. (Например, я считаю, что fastcall
на x86_64 передает целочисленные аргументы в регистрах, а не в стеке.)
Библиотека «интерфейса с внешними функциями» (ffi) может помочь облегчить такого рода взаимодействие между языками.
Других решений пока нет …