You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GCC编译ARMv8汇编时出现unknown mnemonic错误的求助

问题

首次尝试编译包含多个C文件与ARMv8汇编文件的项目,过程中几乎每一行汇编代码都报“unknown mnemonic”错误。例如以下代码片段:

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'

解决方案

核心原因

你写的pushq、subq是x86_64架构的汇编指令,但当前项目目标是ARMv8架构——两种架构的指令集完全不兼容,所以ARM汇编器无法识别这些x86指令,才会报“unknown mnemonic”错误。

具体修复步骤

  1. 替换为ARMv8架构的栈操作指令
    ARMv8没有x86的push/subq这类指令,实现相同功能需要用ARM的指令:

    • 保存寄存器到栈:用str或stp指令,比如要保存x2(对应x86中rdx的功能,需根据实际调用约定调整)到栈:str x2, [sp, #-16]!(ARMv8要求栈16字节对齐,!表示自动更新栈指针)
    • 分配栈空间:一次性分配4个8字节变量的空间,用sub sp, sp, #32代替多次subq $8, %rsp,更符合ARM的编程习惯。
  2. 使用正确的ARM交叉编译工具链
    确保编译时用ARM架构的汇编器和编译器,比如:

    • 汇编.s文件:aarch64-linux-gnu-as file.s -o file.o
    • 编译整个项目:用aarch64-linux-gnu-gcc代替原生x86的gcc,或者在编译时指定目标架构:gcc -target aarch64-linux-gnu ...
  3. 修正寄存器命名
    ARMv8的寄存器命名是x0-x30、sp、pc,而非x86的%rdx、%rsp,需要把代码中所有寄存器引用替换为ARM的对应名称,同时要遵循ARMv8的调用约定(比如参数传递用x0-x7)。

内容的提问来源于stack exchange,提问作者Rose Ben Ann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 04:31:05