VirtualBox中树莓派OS汇编器报错:操作数缺失及SWI指令无效等问题
问题解决步骤
错误原因分析
Error: expecting operand after ','; got nothing和Error: no such instruction : 'swi 0':- 目前主流树莓派OS为**AArch64(64位)**架构,旧ARM32的
SWI指令已被SVC取代;即使是32位ARM系统,SWI的语法也要求写成SWI #0(必须加#号),且系统调用需要指定正确的调用编号。原代码未遵循对应架构的规范,导致汇编器报错。
- 目前主流树莓派OS为**AArch64(64位)**架构,旧ARM32的
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
相关产品推荐
相关产品推荐

