1

所以我看到了一些代码

.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 段的基础),链接器在它之后解析已组装。

但为什么edirdi呢?为什么没有指令mov rdi, moffs64?标签将有一个 64 位地址。我想也许是因为 ELF 基础在 linux 上将是 4MiB?(虽然我对Linux内核知之甚少,只有Windows,它位于0x140000000)。所以也许这是指令的大小优化,但这不排除数据部分大于4GB吗?(不是那样)。它只是安全地假设它不会吗?

4

0 回答 0