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”之前解析错误