交叉编译 ARM 程序集并在 Linux 上模拟非操作系统 ARM 环境



目前,我正在尝试测试我编写的arm 汇编代码。我在 Ubuntu 上工作,所以我下载了一个交叉编译器工具链(arm-linux-gnueabi),这样我就可以编译我的代码,然后使用 qemu-arm 对其进行测试。但是当我尝试使用 arm-none-eabi-gcc 编译时,它会编译但不适用于 qemu-arm。我的猜测是它不起作用,因为我正在为裸机手臂环境进行编译。我的问题是如何使用 qemu-system-arm 而不是 qemu-arm 来模拟裸机手臂环境并测试我的代码?

你想要汇编,你只需要binutils,不要在汇编上使用C编译器,它可能会起作用,但这不会在你的嘴里留下不好的味道吗? 您可能没有单独链接和/或将库存引导程序和链接器脚本与 arm-non-eabi-gcc 一起保留。 下面的例子并不关心arm-none-eabi- vs arm-linux-gnueabi-

Qemu uarts往往实际上没有实现等待字符出去的时间量,也不需要任何初始化,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 函数相当简单。

最新更新