相当于mips伪代码

时间:2014-11-28 12:51:05

标签: gcc assembly mips

由于我无法控制的原因,我坚持使用旧的mips工具链。在编译某些汇编代码时,我收到错误Error: unknown pseudo-op: .reloc
我想知道我可以用什么来代替我来编译代码。

我见过GNU assembler for MIPS: how to emit sync_* instructions?translate mips pseudo instruction into machine code等具体示例。为了学习钓鱼,而不是养鱼,我也想知道如何自己翻译。是否有帮助的查找引用?

有问题的汇编代码是:

    asm ( \
        ".text" "\n" \
        ".align 2" "\n" \
        ".set noreorder" "\n" \
        ".set nomacro" "\n" \
        ".set nomips16" "\n" \
        ".globl " SYMBOL_STRING(cti_##op) "\n" \
        ".ent " SYMBOL_STRING(cti_##op) "\n" \
        SYMBOL_STRING(cti_##op) ":" "\n" \
        ".set macro" "\n" \
        ".cpload $25" "\n" \
        "sw    $31," STRINGIZE_VALUE_OF(THUNK_RETURN_ADDRESS_OFFSET) "($29)" "\n" \
        "la    $25," SYMBOL_STRING(JITStubThunked_##op) "\n" \
        ".set nomacro" "\n" \
        ".reloc 1f,R_MIPS_JALR," SYMBOL_STRING(JITStubThunked_##op) "\n" \
        "1: jalr $25" "\n" \
        "nop" "\n" \
        "lw    $31," STRINGIZE_VALUE_OF(THUNK_RETURN_ADDRESS_OFFSET) "($29)" "\n" \
        "jr    $31" "\n" \
        "nop" "\n" \
        ".set reorder" "\n" \
        ".set macro" "\n" \
        ".end " SYMBOL_STRING(cti_##op) "\n" \
        ); 

可以在https://qt.gitorious.org/qt/qtwebkit/source/0930236a6e8bef5c2b90f1522a06acf9dee9c15d:Source/JavaScriptCore/jit/JITStubs.cpp第1267行开始在线查看

1 个答案:

答案 0 :(得分:1)

.reloc伪操作指示汇编程序在二进制输出中发出重定位。我不确定细节。

相信意图是jalr指令应跳转到名为JITStubThunked_<something>的子程序。请注意寄存器$25如何加载jalr稍后使用的地址。

如果您的上下文不需要重定位(我不知道您的工具链支持哪种对象格式等),您可以尝试完全省略.reloc行。如果地址适合,您可以尝试用la替换jalr + jal " SYMBOL_STRING(JITStubThunked_##op) "