MacOS x86-64架构下汇编数组赋值报错的技术求助
MacOS x86-64 汇编数组寻址错误解决
问题根源分析
你遇到的两个错误,本质是符号名不匹配、操作数长度不兼容、MacOS Mach-O 64位寻址限制三者共同导致的:
- 代码中使用未定义的符号
final,但实际定义的数组是array,汇编器无法解析符号。 - 操作数长度不匹配:比如用
byte(8位)内存操作数对应rax(64位寄存器),或者反过来。 - MacOS x86-64 Mach-O格式禁止32位绝对寻址,即使加了
DEFAULT REL,也要确保寻址方式符合64位相对寻址规范,且避免用8位寄存器(如bl)做偏移(x86-64对8位寄存器偏移的寻址支持有限,易触发解析错误)。
修正后的代码示例
DEFAULT REL ; 强制启用相对寻址,规避32位绝对地址错误 section .text global _start ; MacOS入口点必须声明为全局符号 _start: xor rbx, rbx ; rbx作为循环计数器,初始化为0 mov rax, 1 ; 要存入数组的值 ; 写法1:存入8位字节(对应array resb 3的定义) mov byte [array + rbx], al ; 明确指定byte长度,匹配al的8位 inc rbx mov byte [array + rbx], al inc rbx mov byte [array + rbx], al ; 写法2:如果要存入64位值,需修改.bss段的数组定义为resq 3(每个元素8字节) ; mov [array + rbx*8], rax ; 64位元素需按8字节偏移,rbx*8对应第rbx个元素 ; MacOS退出系统调用 mov rax, 0x2000001 ; exit系统调用号(MacOS与Linux不同) xor rdi, rdi ; 返回状态码0 syscall section .bss array resb 3 ; 定义3个8位字节的数组
错误写法逐一说明
mov [final+rbx], rax:符号final未定义,且array是8位字节数组,rax是64位寄存器,长度不匹配。mov byte[final+rbx], rax:符号错误+长度不匹配(byte对应8位,rax是64位),需将rax改为al。mov byte[final+bl], al:符号错误,且用8位寄存器bl做偏移易触发寻址解析问题,改用64位rbx更稳妥。mov [final+bl], al:符号错误,未明确指定内存操作数长度(汇编器无法自动推断,需加byte前缀)。mov [final+bl], rax:符号错误+长度不匹配(rax64位,内存操作数默认长度与bl偏移不兼容)。
内容的提问来源于stack exchange,提问作者not_here_to_play
相关产品推荐
相关产品推荐

