在MASM中调用C ++函数

时间:2015-02-18 18:46:00

标签: c++ assembly linker 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:函数_asmMain中引用的未解析的外部符号_promptFirst

有关如何解决此问题的任何提示?

2 个答案:

答案 0 :(得分:2)

问题在于C ++编译器mangles the symbols,这是extern "C"构造背后的原因之一,因此符号不会被破坏。

如果将函数声明为extern "C",则编译器不会破坏名称,就像使用您调用的汇编程序函数一样。

答案 1 :(得分:2)

在对象文件上使用dumpbin.exe来获取C ++函数的错位名称。

或者在C ++代码的函数声明中使用extern "C"请求带有C-linkage的符号。

然后你就会知道在汇编代码中要调用什么。