【问题标题】:Disambiguate labels from register names in the Intel syntax消除 Intel 语法中寄存器名称的歧义
【发布时间】:2019-12-27 13:53:44
【问题描述】:

我想知道如何在英特尔语法中的某些指令中区分标签名称和寄存器名称。例如call rdx通常表示间接跳转,但是如果我们在同一个汇编文件中有标签rdx呢?我相信它可以解释为直接跳转到rdx。有没有什么符号可以告诉汇编器哪个是哪个?

【问题讨论】:

  • 你用什么汇编器编程?
  • 我现在正在使用gas。

标签: assembly x86 symbols gnu-assembler intel-syntax


【解决方案1】:

这取决于汇编程序。

我认为对于大多数人来说,注册名称优先,因此call rdx 将始终为 RIP=RDX,而不检查是否存在同名标签(或外部符号)。AT&T 语法 call *%rdx,而不是 AT&T call rdx

一些汇编程序有语法可以消除歧义,但不同的汇编程序没有标准语法

例如对于 NASM,这是 Symbol name conflicts with new register names in new NASM versions? 的副本,您可以使用 $eax 来引用名称为 eax 的符号/标签,而不是寄存器。

对于 Euroassembler,您可以将 : 后缀到名称上,以强制将其解释为符号,而不是注册,例如 call rdx:。 (https://euroassembler.eu/eadoc/#SymbolName),


使用 GAS,您可以使用 .intel_syntax prefix 代替 .intel_syntax noprefix,因此寄存器名称仍需要 %rdx

.intel_syntax 没有操作数意味着.intel_syntax prefix

GAS 的 Intel 语法可能有点落后于 AT&T 语法的二等公民。在%rdx 是寄存器,rdx 是符号的 AT&T 语法中显然不存在这个问题。

.intel_syntax               # prefix is the default
rdx:
   call rdx                 # call rel32
   call %rdx                # call reg

.intel_syntax noprefix
   call rdx                 # call reg
   # I don't know how to write call rel32 to the label with noprefix

然后我们可以在 AT&T 语法中进行反汇编,以便更加清楚/明确地了解我们得到的内容。

$ gcc -c gas-symbol.s && objdump -d -Matt gas-symbol.o

0000000000000000 <rdx>:
   0:   e8 fb ff ff ff          callq  0 <rdx>
   5:   ff d2                   callq  *%rdx

0000000000000007 <with_noprefix>:
   7:   ff d2                   callq  *%rdx

对于整个文件,您通常不希望这样,但您可以切换到 .att_syntax.intel_syntax prefix 用于一行或块,然后切换回正常的 .intel_syntax noprefix

【讨论】:

    【解决方案2】:

    是否有任何符号告诉汇编器哪个是哪个?

    这取决于您使用的汇编程序。这样做没有通用的语法。

    但是,一些汇编程序具有区分标签和保留字的功能。例如 section "3.1 Layout of a NASM Source Line" in the nasm documentation 声明,您可以在标签前加上 $ 以将其与寄存器区分开来:

    标识符也可以以$为前缀,表示它旨在作为标识符而不是保留字来读取;因此,如果您要链接的其他模块定义了一个名为 eax 的符号,您可以参考 NASM 代码中的$eax 来区分该符号和寄存器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-23
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-04
      相关资源
      最近更新 更多