NASM .bss变量报错:Access violation writing location 0x000000000000000C
问题解决:NASM 64位程序访问违例错误
错误原因
你遇到的访问违例是因为[BITS 64]的位置错误,导致汇编器处理符号地址时采用了错误的位模式,最终程序尝试写入0x000000000000000C这个内核空间的无效地址(用户程序无写入权限)。另外,若编译链接时未指定64位目标格式,也会导致.bss段地址解析异常。
修正方案
- 将
[BITS 64]移至文件最开头,确保整个程序以64位模式汇编 - 使用64位目标格式编译链接
修正后的代码
[BITS 64] section .bss var: resb 64 section .text global _start _start: mov qword [var], 10 ; 添加64位Linux退出系统调用,避免程序执行后触发非法指令错误 mov rax, 60 mov rdi, 0 syscall
编译链接命令
nasm -f elf64 your_program.asm -o your_program.o ld your_program.o -o your_program
补充说明
- 原代码中
[BITS 64]放在_start标签内,会导致汇编器处理.bss段和全局符号时仍处于默认位模式(通常为32位),符号var的地址被错误计算,最终指向无效的低地址。 - 修正后的代码添加了退出调用,是因为64位Linux程序执行完业务逻辑后,必须通过系统调用主动退出,否则会继续执行后续非法指令引发错误。
内容的提问来源于stack exchange,提问作者jeffrey
相关产品推荐
相关产品推荐

