【问题标题】:Within __asm__, what does "$variable" mean?在 __asm__ 中,“$variable”是什么意思?
【发布时间】:2015-06-25 16:25:00
【问题描述】:
int context(){"\
       movl $0, %eax;\
       push $xxxxx;\
       push $0;\
       push %eax;\
       ...........
       xxxxx : leave;\
       ret;");
}

我是初学者。

在上面的源代码中,我无法理解“$xxxxx”的含义。 我认为符号“$”只是常量的前面。

此外,我从未见过最后两行。 我知道 leave 和 ret 指令,但是 "xxxxx :" 形式是如此陌生。 我找不到这个例子。

【问题讨论】:

    标签: assembly x86 inline-assembly gnu-assembler


    【解决方案1】:

    $ 前缀表示 GNU 汇编器的 AT&T 语法中的立即操作数。见https://sourceware.org/binutils/docs/as/i386_002dVariations.html#i386_002dVariations

    AT&T 立即操作数以'$'开头;

    行:

    xxxxx : leave;
    

    使用xxxxx 作为标签 (https://sourceware.org/binutils/docs/as/Labels.html#Labels)。

    标签写成一个符号,后面紧跟一个冒号`:'

    如果您想知道,标签xxxxx 的值是直接操作数。

    【讨论】:

    • 标签只是一个位置的名称——基本上是一个内存地址。立即操作数是编码到指令操作码中的数据。
    • 感谢您的回答!但恐怕我无法理解立即操作数和标签的机制。这就是我所理解的---->在“push $xxxxx”行,程序计数器跳转到标签“xxxxx:”并在前面(如调用指令)。并通过指令“ret”返回给调用者。然后在“push $xxxxx”行将什么值推送到堆栈? (如果你很难理解我的评论,对不起。我不擅长英语。)
    • 假设标签xxxxx 的值是0x1234。然后push $xxxxx 会将值0x1234 压入堆栈。该指令不会转移控制或跳转到任何地方——它只是将xxxxx 表示的地址的值压入堆栈。您发布的代码 sn-p 未显示堆栈上的该值做了什么。有可能一些后续指令将 ret 将该值放在堆栈上以充当返回地址,实际上是跳转到它,但这不在您发布的代码中。
    • 哦!我明白你的意思。 '$xxxxx' 正好等于指令 'xxxxx : leave' 的内存地址。非常感谢!!
    猜你喜欢
    • 1970-01-01
    • 2021-10-11
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 2019-06-15
    • 1970-01-01
    相关资源
    最近更新 更多