NASM 32位绝对寻址报错、default rel作用及REX.W无效问题咨询
汇编32位绝对地址报错问题解答
为什么不写default rel会触发macOS基地址报错
x86-64架构下,NASM等汇编器默认对直接符号引用[test]使用32位绝对位移寻址模式:这类寻址会将符号的绝对地址作为32位有符号值,符号扩展后得到64位有效地址。而macOS的64位可执行文件默认启用ASLR,基地址固定分配在4GB(232)以上,32位有符号数无法容纳超过231-1的地址,因此链接阶段会直接抛出地址越界报错。default rel的作用是将默认寻址模式改为RIP相对寻址,通过当前指令指针加偏移的方式计算地址,无需依赖32位绝对地址,自然就不会触发该报错。
两个具体问题解答
- 为什么
mov qword[test], 'hello'属于32位寻址?
没有指定寻址模式时,汇编器默认对符号内存引用使用[disp32]编码,地址计算仅使用32位位移字段,因此属于32位寻址范畴。这里的qword仅指定操作数的长度为8字节,和地址计算的寻址模式没有关联。 - 在指令前添加
REX.W为什么无法解决32位寻址问题?REX.W是x86-64指令的操作数宽度控制前缀,作用仅为指定当前指令的操作数为64位宽度,完全不影响寻址模式的编码逻辑。你写的mov qword本身就已经隐含了REX.W前缀,额外添加不会改变地址计算用32位位移的本质,自然解决不了地址越界问题。
内容的提问来源于stack exchange,提问作者Ruslan
相关产品推荐
相关产品推荐

