Как подключить отдельную процедуру на assemblere к проекту С++, используя dev-c++

Рейтинг: 1Ответов: 1Опубликовано: 23.06.2023

У меня задача подключить отдельную процедуру на ассемблере к коду с++. Я использую 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++ и поэтому пишу тут, как сделать так, чтобы заработало.

Ответы

▲ 0

Ох, ну смотри. Тут несколько шагов, которые нужно выполнить, чтобы подключить ассемблерный код к C++ в Dev-C++:

  1. Компиляция вашего ассемблерного кода в объектный файл.
  2. Линковка этого объектного файла с вашим 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).