Как подключить отдельную процедуру на assemblere к проекту С++, используя dev-c++
У меня задача подключить отдельную процедуру на ассемблере к коду с++. Я использую dev-c++ для написания. Есть пример задачи, который не работает у меня.
//Вызывающая программа file1.cpp
#include <iostream>
extern "C" int MAS_FUNC (int *, int);
int main()
{
int *mas,n,k;
n=5;
mas=new int[n];
for (int i=0; i < n; i=i+1)
{
mas[i]=i;
}
k = MAS_FUNC(mas,n);
}
;Вызываемая функция file2.asm
.586
.MODEL FLAT, C
.CODE
MAS_FUNC PROC C mas:dword, n:dword
mov esi,mas
mov eax, [esi+4]
shl eax, 1
ret
MAS_FUNC ENDP
END
Я не совсем понимаю, как все должно работать, но я просто поместил .cpp и .asm в одну папку. (И это наверняка неправильно, ведь в VS вроде как нужно подключать какой-то masm и т.д.) При запуске .cpp выдает такую ошибку ...undefined reference to `MAS_FUNC. Гайдов я не нашел по dev-c++ и поэтому пишу тут, как сделать так, чтобы заработало.
Ответы (1 шт):
Ох, ну смотри. Тут несколько шагов, которые нужно выполнить, чтобы подключить ассемблерный код к C++ в Dev-C++:
- Компиляция вашего ассемблерного кода в объектный файл.
- Линковка этого объектного файла с вашим C++ кодом.
В Dev-C++ используй интегрированный компилятор GNU (GCC), который поддерживает ассемблерный код на языке AT&T (не на Intel). Это означает, что надо преобразовать ассемблерный код в формат AT&T, если хочешь его скомпилировать с помощью GCC.
Однако, если хочешь использовать ассемблерный код в формате Intel, то надо использовать ассемблер NASM, который можно установить отдельно.
Код на ассемблере должен выглядеть примерно так для NASM:
section .text
global MAS_FUNC
MAS_FUNC:
mov esi, [esp+4]
mov eax, [esi+4]
shl eax, 1
ret
Чтобы скомпилировать ассемблерный код в объектный файл, выполни следующую команду в командной строке:
nasm -f win32 file2.asm
Это создаст файл file2.obj. Затем скомпилируй C++ код и связать его с file2.obj:
g++ file1.cpp file2.obj -o output
Это создаст исполняемый файл output.exe, который уже можно запустить.
И тут важно, эти команды предназначены для выполнения в командной строке, а не внутри среды Dev-C++. На данный момент я не знаю, как можно настроить Dev-C++ для работы с NASM напрямую.
Прежде чем продолжить, убедитесь, что установлены NASM и GCC, и что они доступны из командной строки (т.е. они находятся в вашем PATH).