你想要汇编你只需要 binutils,不要在汇编上使用 C 编译器,它可能会工作,但这不会在你的嘴里留下不好的味道吗?您可能没有单独链接和/或使用 arm-non-eabi-gcc 保留股票引导程序和链接器脚本。下面的例子不关心 arm-none-eabi- vs arm-linux-gnueabi-
Qemu uart 往往实际上并没有实现等待字符出去的时间,也不需要任何初始化,YMMV。
内存映射
MEMORY
{
ram : ORIGIN = 0x00000000, LENGTH = 32K
}
SECTIONS
{
.text : { *(.text*) } > ram
}
所以.s
.globl _start
_start:
b reset
b hang
b hang
b hang
b hang
b hang
b hang
b hang
hang: b hang
reset:
ldr r0,=0x101f1000
mov r1,#0
top:
add r1,r1,#1
and r1,r1,#0x07
orr r1,r1,#0x30
str r1,[r0]
b top
构建
arm-linux-gnueabi-as --warn --fatal-warnings -march=armv5t so.s -o so.o
arm-linux-gnueabi-ld so.o -T memmap -o notmain.elf
arm-linux-gnueabi-objdump -D notmain.elf > notmain.list
arm-linux-gnueabi-objcopy notmain.elf -O binary notmain.bin
运行
qemu-system-arm -M versatilepb -m 128M -nographic -kernel notmain.bin
然后 ctrl-a 然后 x 退出 qemu 控制台回到命令行。
这将永远打印出 1234567012345670... 或直到您停止它
另一种运行方式是
qemu-system-arm -M versatilepb -m 128M -kernel notmain.bin
然后 ctrl-alt-3 (不是 F3 而是 3) 将切换到 serial0 控制台
你可以看到输出,完成后可以关闭 qemu 控制台。
您可以尝试其他机器。他们的外围设备当然会有所不同,架构也不同,大多数应该兼容 armv4 arm 指令或拇指指令(如果是 cortex-m)。
向其中添加 C 函数相当简单。