GAS Intel语法下mov rdi, offset:symbol指令汇编报错如何解决?
问题原因
报错由个人设备与学校设备的GNU汇编器(GAS,GCC默认调用的汇编后端)版本差异导致:
- 2.31及以上版本的Binutils(GAS所属的工具集)新增支持
offset:带冒号的Intel语法偏移量写法,和MASM语法对齐 - 你本地的Binutils版本低于2.31,无法识别
offset后的冒号,因此抛出第6行表达式错误、message为无效冗余内容的报错
解决方案
两种修复方案可任选:
方案一:修改代码兼容旧版本汇编器(推荐,无环境依赖问题)
将代码第6行的mov rdi, offset:message修改为mov rdi, offset message,去掉offset后的冒号即可,该写法新旧版本汇编器均支持。
修改后的完整可运行代码如下:
.intel_syntax noprefix .global main .text main: mov rdi, offset message call puts mov rax, 0 ret message: .asciz "Hello, world!"
修改后执行原编译命令gcc -o hello_intel hello_intel.S即可正常编译运行。
方案二:升级本地Binutils版本
将你个人设备的Binutils工具集升级到2.31及以上版本,无需修改代码即可直接编译原示例。
内容的提问来源于stack exchange,提问作者JM445
相关产品推荐
相关产品推荐

