树莓派上如何让GCC生成ARM64汇编指令?
在ARM64树莓派上用GCC生成ARM64汇编的正确方式
首先明确:你执行gcc -S main.c后生成的已经是ARM64(ARMv8-A)汇编代码,不是AT&T语法。ARM架构下的GCC默认生成的就是ARM风格的汇编,-masm是x86架构专属的选项,ARM64版本的GCC不支持,这就是你报错的原因。
验证当前输出的是ARM64汇编
看你生成的汇编内容:
- 开头的
.arch armv8-a明确标注了是ARMv8-A架构(即ARM64) stp、mov、adrp、bl这些都是ARM64的指令,指令格式是目标寄存器在前,源操作数在后,这是ARM汇编的典型特征,和x86的AT&T语法(源在前、目标在后,带%前缀)完全不同。
生成更简洁易读的ARM64汇编
如果觉得默认生成的汇编里调试信息太多(比如.cfi_*系列伪指令),可以用以下命令生成更简洁的版本:
gcc -S -O0 -fno-asynchronous-unwind-tables main.c
各选项作用:
-O0:关闭编译器优化,生成的汇编逻辑和C代码一一对应,更容易理解-fno-asynchronous-unwind-tables:移除用于异常回溯的调试伪指令,精简汇编内容
执行后生成的main.s会类似这样:
.arch armv8-a .file "main.c" .text .section .rodata .align 3 .LC0: .string "Hello world!" .text .align 2 .global main .type main, %function main: stp x29, x30, [sp, -16]! mov x29, sp adrp x0, .LC0 add x0, x0, :lo12:.LC0 bl puts mov w0, 1 ldp x29, x30, [sp], 16 ret .size main, .-main .ident "GCC: (Debian 12.2.0-14) 12.2.0" .section .note.GNU-stack,"",@progbits
关于ARM64汇编的语法选项
ARM64架构下没有ARM/Thumb指令集切换的概念,GCC默认只会生成ARM64的汇编指令,不需要额外指定语法选项。如果一定要显式指定,ARM架构(32位)的-marm选项在ARM64下也能识别,但实际不会产生任何变化,因为ARM64只有一种指令集。
内容的提问来源于stack exchange,提问作者DavidT
相关产品推荐
相关产品推荐

