所以我看到了一些代码
.LC0:
.string "Hello world"
main:
sub rsp, 8
mov edi, OFFSET FLAT:.LC0
call puts
xor eax, eax
add rsp, 8
ret
根据我收集到的信息,当内存模型平坦时使用 OFFSET FLAT。OFFSET 将转换为段选择器 (DS) 和 OFFSET,而 OFFSET FLAT 转换为标签 LC0 相对于 0 的绝对地址(因为这是平面模式下 DS 段的基础),链接器在它之后解析已组装。
但为什么edi
不rdi
呢?为什么没有指令mov rdi, moffs64
?标签将有一个 64 位地址。我想也许是因为 ELF 基础在 linux 上将是 4MiB?(虽然我对Linux内核知之甚少,只有Windows,它位于0x140000000)。所以也许这是指令的大小优化,但这不排除数据部分大于4GB吗?(不是那样)。它只是安全地假设它不会吗?