GCC:错误:表达式后出现垃圾 `:0x+57f120'

Posted

技术标签:

【中文标题】GCC:错误:表达式后出现垃圾 `:0x+57f120\'【英文标题】:GCC: Error: junk `:0x+57f120' after expressionGCC:错误:表达式后出现垃圾 `:0x+57f120' 【发布时间】:2014-07-31 14:03:57 【问题描述】:

在我之前的问题here 之后,当编译器尝试编译以下代码时,我现在有一个“表达式后的错误垃圾”:

u32 jmpAdd = BW::BWFXN_SpendRepairReturnAddress;
//BW::BWFXN_SpendRepairReturnAddress has the following value: 0x0046700D
__asm__ __volatile__
(
    "movl ds:0x+57f120(, %eax, 4), %ecx\n\t"
    "jmp %0":"=m"(jmpAdd)
);

GCC 给我以下错误:

Error: junk ':0x+57f120' after expression
Error: invalid instruction suffix for 'jmp'

请问我该如何纠正这些错误?

编辑:原始代码如下(我使用 ta2as v0.8.2 对其进行了转换):

__asm

  mov ecx, dword ptr ds:[eax*4+0x57f120]
  jmp BW::BWFXN_SpendRepairReturnAddress

【问题讨论】:

ta2as 可以将语法转换为 AT&T 语法,但不一定转换为 GCC 中内联汇编的正确格式。我推荐以下两个指南:ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html 和 wiki.osdev.org/Inline_Assembly "0x+57f120" 对我来说看起来不是一个有效的十六进制文字,但我并不精通 gcc 汇编。 【参考方案1】:

将其更改为以下内容,它应该可以编译:

__asm__ __volatile__
(
    "movl %%ds:0x57f120(, %%eax, 4), %%ecx\n\t"
    "jmp *%0" : : "m"(jmpAdd)
);

不幸的是,在查看source 之后,您可能试图转换它实际上并不能正常工作。 GCC 不支持 x86 目标上的 naked 函数。

【讨论】:

以上是关于GCC:错误:表达式后出现垃圾 `:0x+57f120'的主要内容,如果未能解决你的问题,请参考以下文章

程序集,1 个文件中有两个函数,在表达式后出现错误:垃圾 `(%ebp)'

硬盘文件读取错误,无法启动

Solaris 上的 GCC - 在“0x00000002”之前解析错误

GCC 模板问题

在使用 -lstdc++fs 选项后使用 GCC6 时出现实验性::文件系统链接器错误

升级到 Xcode 8 后出现 GCC 5.4 链接器错误