【问题标题】:error: unknown mnemonic in armv8 when compiling with gcc错误:使用 gcc 编译时 armv8 中的未知助记符
【发布时间】:2022-12-09 20:22:23
【问题描述】:

我正在尝试编译一个包含多个 c 文件和一个用 ARMv8 编写的汇编文件的项目,这是我以前没有做过的,所以我在理解我收到的一些错误消息时遇到了一些麻烦。

对于几乎每一行,我始终收到“未知助记符”错误。例如,对于下面的 sn-p 代码,

100    ## Save oSum to the stack.
101    pushq %rdx
102
103    ## unsigned long ulCarry
104    subq $8, %rsp
105 
106    ## unsigned long ulSum
107    subq $8, %rsp
108
109    ## long lIndex
110    subq $8, %rsp
111
112    ## long lSumLength
113    subq $8, %rsp

我收到以下消息,

file.s:101: Error: unknown mnemonic `pushq' -- `pushq %rdx'
file.s:104: Error: unknown mnemonic `subq' -- `subq $8,%rsp'
file.s:107: Error: unknown mnemonic `subq' -- `subq $8,%rsp'
file.s:110: Error: unknown mnemonic `subq' -- `subq $8,%rsp'
file.s:113: Error: unknown mnemonic `subq' -- `subq $8,%rsp'

我在这里做错了什么?我怎样才能解决这个问题?

非常感谢您的帮助。

【问题讨论】:

  • 我不是汇编专家(尤其是 ARM),但对我来说它们看起来不像 ARM 指令。它们看起来更像是 x86-x64 代码。
  • 您将无法为 armv8 汇编此代码,因为它是为 amd64 编写的。您将不得不从头开始重写它,或者找到一种不使用该文件来编译项目的方法。
  • 那个手写的 asm 适用于 x86-64(又名 AMD64),而不是 AArch64。顺便说一句,它的效率低得离谱。一个 subq $32, %rsp 在一条指令中具有相同的效果,为多个局部变量保留空间。如果 asm 的其余部分编写得如此低效,那么使用优化编译器编译的纯 C 回退实现可能会更好(如果项目有的话)。

标签: c assembly arm project armv8


【解决方案1】:

问题其实很简单,你输入的是 64 位 x86 程序集,而不是 ARM。您编写的代码在 ARM 汇编中确实有等效代码,但寄存器名称和指令名称会有所不同。我相信 armv8 是一个 32 位架构(有一个 64 位版本,通常称为 AArch64 或 arm64。)不幸的是我对此并不熟悉。尝试这个:

push {r4,r5,r6,lr}  //ARM calling convention requires an even number of regs to be pushed
sub sp,sp,32

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2016-09-27
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多