Я работаю над программой, которая будет использовать MASM для вызова некоторых функций C ++. Я определил в отдельном файле сумму 2 целых и отобразил результат.
В настоящее время я не могу запустить ‘main.cpp’ asmMain()
вызывать функции из main.cpp.
; ---------------------------------------
promptFirst PROTO C
promptSecond PROTO C
printInt PROTO C
.586
.model flat, stdcall
.stack 4096
; ---------------------------------------
.DATA
first DWORD 0
second DWORD 0
; --------------------------------
.CODE
asmMain PROC C
mov first, promptFirst
ret
asmMain ENDP
PUBLIC asmMain
END
#include <iostream>
using namespace std;
void asmMain();
int promptFirst();
int promptSecond();
void printInt(int myint);
int main() {
asmMain();
}
int promptFirst() {
cout << " The first number = ";
int newint;
cin >> newint;
return newint;
}
int promptSecond() {
cout << "\nThe second number = ";
int newint;
cin >> newint;
return newint;
}
void printInt(int myint) {
cout << myint;
}
Я получаю ошибку для текущего кода:
Начата сборка: Проект: Project_Name, Конфигурация: Отладка Win32
main.cpp
code.obj: ошибка LNK2019: неразрешенный внешний символ _promptFirst, указанный в функции _asmMain
Любые советы о том, как решить эту проблему?
Проблема в том, что компиляторы C ++ Mangles символы, что является одной из причин extern "C"
построить так, чтобы символы не были искажены.
Если вы объявите функцию extern "C"
тогда компилятор не будет искажать имя, как вы делаете с вызываемой вами функцией ассемблера.
использование dumpbin.exe
в вашем объектном файле, чтобы получить искаженное имя ваших функций C ++.
Или попросите символ с С-связью, используя extern "C"
на объявлениях функций в вашем коде C ++.
Тогда вы будете знать, что вызывать в вашем ассемблере.