用ASM编译ASM和C调试
Compile ASM and C with ASM for debugging
我有两个小文件想在 CMake 中编译以便使用 CLion 和 GDB 进行调试
main.c
int my_strlen(char *);
int main()
{
printf("Test: %d\n", my_strlen("Hello"));
}
我的 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
我正在尝试使用 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)
有人知道在 C 项目中添加 ASM 文件并使用 CMakeList.txt 编译的好命令吗?
您可能必须使用 enable_language(ASM_NASM)
在 CMAKE 中启用 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)
由于您的代码似乎是 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)
我有两个小文件想在 CMake 中编译以便使用 CLion 和 GDB 进行调试
main.c
int my_strlen(char *);
int main()
{
printf("Test: %d\n", my_strlen("Hello"));
}
我的 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
我正在尝试使用 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)
有人知道在 C 项目中添加 ASM 文件并使用 CMakeList.txt 编译的好命令吗?
您可能必须使用 enable_language(ASM_NASM)
在 CMAKE 中启用 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)
由于您的代码似乎是 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)