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

VirtualBox中树莓派OS汇编器报错:操作数缺失及SWI指令无效等问题

问题解决步骤

错误原因分析

  1. Error: expecting operand after ','; got nothing 和 Error: no such instruction : 'swi 0':
    • 目前主流树莓派OS为**AArch64(64位)**架构,旧ARM32的SWI指令已被SVC取代;即使是32位ARM系统,SWI的语法也要求写成SWI #0(必须加#号),且系统调用需要指定正确的调用编号。原代码未遵循对应架构的规范,导致汇编器报错。
  2. bash: arm-none-eabi-as: command not found:
    • arm-none-eabi-as是ARM交叉编译工具链,树莓派原生系统无需使用,直接用系统自带的as即可;若需安装,可通过包管理器获取。

针对不同架构的修复方案

方案1:64位AArch64系统(主流版本)

修改汇编代码为符合AArch64系统调用规范的版本:

.text
.global _start
_start:
    // 调用write系统输出字符'A'
    MOV X0, #1          @ 文件描述符:1表示标准输出(stdout)
    ADR X1, msg         @ 指向存储字符'A'的内存地址
    MOV X2, #1          @ 输出长度:1字节
    MOV X8, #64         @ write系统调用编号(AArch64 Linux固定为64)
    SVC #0              @ 触发系统调用

    // 调用exit退出程序
    MOV X0, #0          @ 退出码:0表示正常退出
    MOV X8, #93         @ exit系统调用编号(AArch64 Linux固定为93)
    SVC #0

msg:
    .byte 65            @ 存储字符'A'(ASCII码65)

编译与运行:

# 汇编生成目标文件
as -o asmtut.o asmtut.s
# 链接生成可执行文件
ld -o asmtut asmtut.o
# 运行程序
./asmtut

执行后会输出字符A。

方案2:32位ARM系统(旧版OS)

修改汇编代码为符合ARM32系统调用规范的版本:

.text
.global _start
_start:
    // 调用write系统输出字符'A'
    MOV R0, #1          @ 文件描述符:1表示标准输出(stdout)
    LDR R1, =msg        @ 指向存储字符'A'的内存地址
    MOV R2, #1          @ 输出长度:1字节
    MOV R7, #4          @ write系统调用编号(ARM32 Linux固定为4)
    SWI #0              @ 触发系统调用(需加#号,符合语法要求)

    // 调用exit退出程序
    MOV R0, #0          @ 退出码:0表示正常退出
    MOV R7, #1          @ exit系统调用编号(ARM32 Linux固定为1)
    SWI #0

msg:
    .byte 65            @ 存储字符'A'(ASCII码65)

编译与运行:

as -o asmtut.o asmtut.s
ld -o asmtut asmtut.o
./asmtut

关于arm-none-eabi-as的安装(可选)

如果确实需要使用交叉编译工具链,可通过以下命令安装:

sudo apt update
sudo apt install gcc-arm-none-eabi

安装完成后即可使用arm-none-eabi-as命令。

内容的提问来源于stack exchange,提问作者hamza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:05:15