我正在尝试使用 CMake 为 Windows 11 上的 Visual Studio 生成的项目,通过 NASM 编译汇编代码。
我的CMake项目脚本:
cmake_minimum_required(VERSION 3.27)
project(AssemblyTest LANGUAGES CXX ASM_NASM)
if(CMAKE_ASM_NASM_COMPILER)
message("NASM is present")
else()
message("Download NASM")
endif()
set(MY_SOURCES src/hello_world.asm)
add_executable(AssemblyTest ${MY_SOURCES})
我的汇编代码:
section .text
global _start ; необходимо для линкера (ld)
_start: ; сообщает линкеру стартовую точку
mov edx,len ; длина строки
mov ecx,msg ; строка
mov ebx,1 ; дескриптор файла (stdout)
mov eax,4 ; номер системного вызова (sys_write)
int 0x80 ; вызов ядра
mov eax,1 ; номер системного вызова (sys_exit)
int 0x80 ; вызов ядра
section .data
msg db 'Hello, world!', 0xa ; содержимое строки для вывода
len equ $ - msg ; длина строки
我尝试使用所有可能的预设(调试/发布/x86/x64等)运行构建,但仍然没有结果。
UPD1:我尝试直接运行 NASM,当我尝试汇编上面的代码时,它报告了此错误:
hello_world.asm:1: error: parser: instruction expected
UPD2:我的 NASM 版本是
2.16.02rc6
。我要求另一位程序员使用完全相同的参数和 NASM 构建为我组装这段代码,这对他有用。
UPD3:即使下面的程序也无法组装,并出现与
UPD1
中提到的完全相同的错误
section .text
global main
main:
ret
已修复
发生错误的原因是源程序集文件采用带 BOM 的 UTF-8 编码。显然 NASM “不喜欢它”,因此将源文件编码更改为 ASCII 解决了这个问题。