C++ 文件无法识别汇编文件中定义的函数

E E*_*lon 1 c++ assembly g++ nasm

我正在尝试学习一些汇编代码,并且正在遵循一本书提出的教程,我的 C++ 代码定义如下(Ch02_01.cpp):

#include <iostream>


using namespace std;

extern "C" int IntegerAddSub_(int a, int b, int c, int d);
int main() {
    int a, b, c, d, result;
    a = 101;  b = 34; c = -190; d = 25;
    result = IntegerAddSub_(a, b, c, d);
    cout << "result = " << result << n1;
    return 0;
}

Run Code Online (Sandbox Code Playgroud)

知道函数 IntegerAddSub_ 是在文件夹中的汇编文件(扩展名为 asm)中定义的,如下(Ch02_01.asm):

; extern "C" int IntegerAddSub_(int a, int b, int c, int d);

        .code
IntegerAddSub_ proc
; Calculate a + b + c -d
        mov eax, ecx      ;eax = a
        add eax, edx      ;eax = a + b
        add eax, r8d      ;eax = a + b + c
        sub eax, r9d      ;eax = a + b + c - d
        ret               ; return result to caller

IntegerAddSub_ endp
        end
Run Code Online (Sandbox Code Playgroud)

错误信息 :

Error message :
/home/.local/share/JetBrains/Toolbox/apps/CLion/ch-0/222.3345.126/bin/cmake/linux/bin/cmake --build /home/Assembly/cmake-build-debug --target Assembly -j 16
[1/1] Linking CXX executable Assembly
FAILED: Assembly 
: && /usr/bin/c++ -g  CMakeFiles/Assembly.dir/Ch02_01.cpp.o -o Assembly   && :
/usr/bin/ld: CMakeFiles/Assembly.dir/Ch02_01.cpp.o: in function `main':
/home/Assembly/Ch02_01.cpp:25: undefined reference to `IntegerAddSub_'
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.
Run Code Online (Sandbox Code Playgroud)

我认为错误的语义很简单,C++ 文件无法识别汇编程序文件中定义的函数。

根据评论中的交流,我将添加以下信息:我正在使用CLION(来自Jetbrains),这是我的CMakeLists.txt

cmake_minimum_required(VERSION 3.23)
project(Assembly)

set(CMAKE_CXX_STANDARD 14)
set ( SOURCES
      Ch02_01.asm
    )
add_executable(Assembly
        Ch02_01.cpp)

Run Code Online (Sandbox Code Playgroud)

我不知道如何使用 g++ 编译它,它永远无法识别 ASM 文件中的函数,请问我怎样才能成功编译它?我在Ubuntu。谢谢

Ted*_*gmo 5

您需要告诉 CMake 该项目也包含代码 - 或者(如果它实际上是这样)。

例子:

cmake_minimum_required(VERSION 3.22)
project(Assembly CXX ASM_NASM) # or perhaps it should be ASM_MASM

set(CMAKE_CXX_STANDARD 14)

add_executable(Assembly Ch02_01.asm Ch02_01.cpp)
Run Code Online (Sandbox Code Playgroud)

这使得它至少尝试编译该asm文件,但对我来说它失败了:

cmake_minimum_required(VERSION 3.22)
project(Assembly CXX ASM_NASM) # or perhaps it should be ASM_MASM

set(CMAKE_CXX_STANDARD 14)

add_executable(Assembly Ch02_01.asm Ch02_01.cpp)
Run Code Online (Sandbox Code Playgroud)

  • 啊,是的,这也是我得到的,因为我没有安装 [tag:masm] 编译器。 (2认同)
  • @EEpsylon 和 TedLyngmo:这是 MASM 源代码。主要标志是 `foo proc` / ... / `endp` 而不是 NASM/FASM `global foo` / `foo:`。还有“.code”而不是“section .text”,以及最后一行的“end”指令。它看起来对于使用 Windows x64 调用约定的 x86-64 MASM(或 JWASM)有效。您可以通过将 mov/add 替换为 `lea eax, [rcx+rdx]` 来进行优化,但是错过优化/为初学者故意简化代码与构建 + 链接无关。 (2认同)