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

树莓派上如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:33:28