【问题标题】:gnu assembler: get address of label/variable [INTEL SYNTAX]gnu 汇编器:获取标签/变量的地址 [INTEL SYNTAX]
【发布时间】:2009-12-13 19:12:06
【问题描述】:

我有这样的代码:

.bss
woof: .long 0

.text
bleh:
...some op codes here.

现在我想将 woof 的地址移动到 eax 中。这样做的intel 语法 代码是什么?将 bleh 的地址移动到 ebx 也是如此。

非常感谢您的帮助!

【问题讨论】:

    标签: syntax label gnu intel object-address


    【解决方案1】:

    bss 部分中不能有任何实际对象。一些汇编程序可能仍然允许您切换到 .bss 部分,但您可以在那里做的只是说类似:x: . = . + 4

    如今,在大多数汇编程序中,特别是在 gnu 中,不再有 .bss 指令,因此您暂时切换到 bss 并一次性创建 bss 符号,例如:.comm sym,size,alignment。这就是为什么您可能会收到错误“.bss 指令无法识别”或类似的错误。

    然后您可以通过以下任一方式获取地址:

    lea woof, %eax
    

    movl $woof, %eax
    

    更新:啊哈,英特尔语法,不是英特尔架构。好的:

    .intel_syntax noprefix
        lea    esi,fun
        lea    esi,[fun]
        mov     eax,OFFSET FLAT:fun
    .att_syntax
        lea     fun, %eax
        mov     $fun, %eax
    .data
    fun: .long 0x123
    

    所有lea 表单都应该生成相同的代码。

    【讨论】:

    • 谢谢,很有启发性。不过,我关心的并不是真正的 bss 或数据部分。我只需要知道如何使用 gnu INTEL 语法而不是 AT&T 将标签的地址加载到地址中。我尝试了 mov eax, woof 和 mov eax, dword ptr [woof],但两者都给了我相同的结果。我想做类似 movl $woof, %eax,但使用 gnu intel 语法。
    • 感谢 DigitalRoss!我也在使用 lea,但我想知道我是否可以使用 mov 来做到这一点。我想 OFFSET FLAT 是这里的关键?
    • 对,有多种寻址方式; MOV 可以加载一个立即数,这可能恰好也是一个地址,或者它可以加载一个地址的内容。通常在 Unix 上是 movl $woof,%eax vs movl woof,%eax,但在 Intel 语法中它有点老套。无论如何,“是”,lea 和 mov 都可以加载地址。
    • 作为记录,请始终使用mov $foo, regmov reg, OFFSET foo,而不是 32 位模式下的 LEA。 LEA 长 1 个字节,并且可以在大多数 CPU 上较少的执行端口上运行,因此将 32 位常量放入寄存器(包括符号的绝对地址)完全没有意义。 (RIP-relative LEA 在 64 位代码中很有用,但机器码功能只存在于 64 位模式中,并且在 asm 源中有特殊语法。How to load address of function or label into register
    猜你喜欢
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 2021-11-27
    • 2016-06-22
    相关资源
    最近更新 更多