使用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”错误。
具体修复步骤
替换为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的编程习惯。
- 保存寄存器到栈:用
使用正确的ARM交叉编译工具链
确保编译时用ARM架构的汇编器和编译器,比如:- 汇编
.s文件:aarch64-linux-gnu-as file.s -o file.o - 编译整个项目:用
aarch64-linux-gnu-gcc代替原生x86的gcc,或者在编译时指定目标架构:gcc -target aarch64-linux-gnu ...
- 汇编
修正寄存器命名
ARMv8的寄存器命名是x0-x30、sp、pc,而非x86的%rdx、%rsp,需要把代码中所有寄存器引用替换为ARM的对应名称,同时要遵循ARMv8的调用约定(比如参数传递用x0-x7)。
内容的提问来源于stack exchange,提问作者Rose Ben Ann
相关产品推荐
相关产品推荐

