用ASM编译ASM和C以进行调试

Ben*_* Sx 3 c assembly cmake nasm clion

我有两个要在CMake中编译的小文件,以便使用CLion和GDB对其进行调试

main.c

int my_strlen(char *);

int main()
{
    printf("Test: %d\n", my_strlen("Hello"));
}
Run Code Online (Sandbox Code Playgroud)

我的ASM文件中有一个my_strlen文件

    [BITS 64]

    global my_strlen
    section .text

my_strlen:
    push rbp
    mov rbp, rsp
    xor rcx, rcx

loop:
    cmp BYTE [rdi + rcx], 0
    jz end
    inc rcx
    jmp loop

end:
    mov rax, rcx
    mov rsp, rbp
    leave
    ret
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用CMakeList.txt进行编译,但我添加了set_source_files_properties,但仍然无法正常工作

cmake_minimum_required(VERSION 3.9)
project(ASM)

set(CMAKE_CXX_STANDARD 11)
set_source_files_properties(src/strlen.asm PROPERTIES COMPILE_FLAGS "-x assembler-with-c")

add_executable(main
        src/strlen.asm
        tests/src/main.c)
Run Code Online (Sandbox Code Playgroud)

有人知道在C项目中添加ASM文件并使用CMakeList.txt进行编译的好命令吗?

Mic*_*tch 7

您可能必须在CMAKE中启用NASM支持enable_language(ASM_NASM),然后设置适当的组装选项:

cmake_minimum_required(VERSION 3.9)
project(ASM)
enable_language(ASM_NASM)
set(CMAKE_ASM_NASM_OBJECT_FORMAT elf64)
set(CMAKE_ASM_NASM_COMPILE_OBJECT "<CMAKE_ASM_NASM_COMPILER> <INCLUDES> \
    <FLAGS> -f ${CMAKE_ASM_NASM_OBJECT_FORMAT} -o <OBJECT> <SOURCE>")

set_source_files_properties(src/strlen.asm PROPERTIES COMPILE_FLAGS "-g -Fdwarf")

set(CMAKE_CXX_STANDARD 11)

add_executable(main
        src/strlen.asm
        tests/src/main.c)
Run Code Online (Sandbox Code Playgroud)

由于您的代码似乎是64位目标,因此我实际上-f elf64是将命令行选项传递给NASM。我将格式类型放在其自己的环境变量中CMAKE_ASM_NASM_OBJECT_FORMAT。要在NASM中启用调试信息,您可以使用-g -Fdwarf


如果进行调试和发布构建,则可以检查构建类型,并使用类似的方法相应地设置标志:

cmake_minimum_required(VERSION 3.9)
project(ASM)
enable_language(ASM_NASM)

set(CMAKE_ASM_NASM_OBJECT_FORMAT elf64)
set(CMAKE_ASM_NASM_COMPILE_OBJECT "<CMAKE_ASM_NASM_COMPILER> <INCLUDES> \
    <FLAGS> -f ${CMAKE_ASM_NASM_OBJECT_FORMAT} -o <OBJECT> <SOURCE>")

if(CMAKE_BUILD_TYPE STREQUAL "Debug")
    set(CMAKE_ASM_NASM_FLAGS "${ASM_NASM_FLAGS} -g -Fdwarf")
else()
    set(CMAKE_ASM_NASM_FLAGS "${ASM_NASM_FLAGS}")
endif()

set(CMAKE_CXX_STANDARD 11)

add_executable(main
        src/strlen.asm
        tests/src/main.c)
Run Code Online (Sandbox Code Playgroud)