Keil可运行的ARM32汇编代码在Ubuntu交叉编译报语法错误如何解决
问题根源
你当前遇到的报错不是架构选择错误导致的,核心原因是汇编语法不兼容:Keil环境使用的是ARM官方armasm汇编器的语法规则,而Ubuntu下arm-linux-gnueabihf-as属于GNU Binutils的汇编器(GAS),两者的伪指令、注释规则、段定义规则完全不同,你代码里的注释、伪指令都被GAS当成了无效指令解析,才会出现批量报错。
适配GNU工具链的修改方案
你需要对原有Keil风格汇编做如下调整,即可正常编译:
- 段定义:将Keil的
AREA prgm1, CODE, READONLY替换为GAS的.text - 入口声明:将Keil的
ENTRY替换为.global _start,GNU链接器默认入口标识符为_start - 标签规则:所有代码标签后加冒号,比如
main改为main: - 注释规则:Keil用
;作为单行注释开头,ARM平台的GAS默认用@作为单行注释开头,把所有;替换为@即可避免注释被识别为指令 - 栈操作:
PUSH{LR}/POP{LR}要在指令和大括号之间加空格,改为PUSH {LR}/POP {LR} - 结束标识:将Keil的
END替换为GAS的.end
修改后可正常编译的代码示例
.text .global _start _start: main: MOV R1, #2 BL func1 MOV R9, R8 @ MOV F(2) into R9 MOV R1, #5 BL func1 stop: B stop func2: MUL R2, R6, R3 @ Multiplies bk with x0 ADD R0, R5, R2 @ Adds the results of the previous line with ak-1 BX LR @ Output Value func1: MOV R6, #1 @ MOV the first coefficient into R6 MOV R5, #3 @ MOV the second coefficient into R5 MOV R3, R1 @ MOV the input to R3 PUSH {LR} @ Pushes back to the main BL func2 @ Call function to output MOV R6, R0 @ MOV the ouput value to R6 MOV R5, #5 @ Third Coefficient BL func2 MOV R6, R0 MOV R5, #7 BL func2 MOV R6, R0 MOV R5, #9 BL func2 MOV R8, R0 POP {LR} @ POP LR from the stack BX LR .end
适配LPC2104架构的编译命令
LPC2104为ARMv4T架构的ARM7TDMI核心,编译时指定架构参数即可生成兼容的二进制文件:
arm-linux-gnueabihf-as -march=armv4t prgm1.s -o asm32.o && arm-linux-gnueabihf-ld -static -m armelf_linux_eabi asm32.o -o asm32
其他运行代码的方案
- 不需要修改代码语法的前提下,可以在Ubuntu上通过Wine运行Windows版Keil,或者安装ARM官方提供的Development Studio工具链
- 编译生成的二进制文件可以直接用
qemu-arm静态模拟器运行,不需要实体硬件:qemu-arm ./asm32
内容的提问来源于stack exchange,提问作者Sasa Salmen
相关产品推荐
相关产品推荐

