сборка — вызов функций C ++ в MASM

Я работаю над программой, которая будет использовать MASM для вызова некоторых функций C ++. Я определил в отдельном файле сумму 2 целых и отобразил результат.

В настоящее время я не могу запустить ‘main.cpp’ asmMain() вызывать функции из main.cpp.

code.asm

; ---------------------------------------

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

main.cpp

#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

Любые советы о том, как решить эту проблему?

1

Решение

Проблема в том, что компиляторы C ++ Mangles символы, что является одной из причин extern "C" построить так, чтобы символы не были искажены.

Если вы объявите функцию extern "C" тогда компилятор не будет искажать имя, как вы делаете с вызываемой вами функцией ассемблера.

2

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

использование dumpbin.exe в вашем объектном файле, чтобы получить искаженное имя ваших функций C ++.

Или попросите символ с С-связью, используя extern "C" на объявлениях функций в вашем коде C ++.

Тогда вы будете знать, что вызывать в вашем ассемблере.

2

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