好吧,我已经在整个互联网上搜索了将使用 arm-linux-gnueabi-as 和 qemu 运行的代码。打印一个整数值。从字符串。例行公事会有所帮助。
1 回答
显然你没有搜索整个互联网......因为,如果没有别的,qemu源代码包含你问题的所有答案......
QEMU 模拟系统。您是否尝试在模拟的手臂系统上做一些裸机?或者您是否正在尝试运行 arm linux 操作系统并在操作系统中创建一个在 qemu 上运行的操作系统上运行的程序集?如果是后者,则与qemu无关,这是操作系统问题而不是qemu问题。这不是语言问题(asm),而是操作系统问题。asm 和低级是两个不同的东西。asm 并不意味着低级访问,对于低级的东西绝对不需要(并且很少使用)。
如果您对操作系统不感兴趣,而只是对裸机感兴趣,这里是在 qemu 控制台上获取串行输出的众多方法之一。字符串和整数等是无语言问题(相同的解决方案可以应用于任何编程语言,asm、c、python 等解决问题然后将语言应用于问题)。
开始.s
.globl _start
_start:
ldr r0,=0x101f1000
mov r1,#0
loop:
add r1,r1,#1
and r1,r1,#7
add r1,r1,#0x30
str r1,[r0]
mov r2,#0x0D
str r2,[r0]
mov r2,#0x0A
str r2,[r0]
b loop
内存映射
MEMORY
{
rom : ORIGIN = 0x00010000, LENGTH = 32K
}
SECTIONS
{
.text : { *(.text*) } > rom
}
生成文件
CROSS_COMPILE ?= arm-none-linux-gnueabi
AOPS = --warn --fatal-warnings
COPS = -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding
hello_world.bin : startup.s memmap
$(CROSS_COMPILE)-as $(AOPS) startup.s -o startup.o
$(CROSS_COMPILE)-ld startup.o -T memmap -o hello_world.elf
$(CROSS_COMPILE)-objdump -D hello_world.elf > hello_world.list
$(CROSS_COMPILE)-objcopy hello_world.elf -O binary hello_world.bin
运行
qemu-system-arm -M versatilepb -m 128M -nographic -kernel hello_world.bin
但我不知道如何离开控制台
相反,如果你这样做:
qemu-system-arm -M versatilepb -m 128M -kernel hello_world.bin
然后 ctrl-alt-3 (不是 F3 而是 3) 将切换到串行控制台,您可以看到输出,并且可以通过关闭控制台窗口来关闭 qemu。
通用 pb qemu 目标中的 uart tx 寄存器位于地址 0x101f1000。因为这是一个模拟,您可以“尝试”并发现写入该地址而不进行任何真实世界的 uart 设置“正常工作”,并且作为一个模拟系统,它可能会立即传输字符,因此您不必等待让它完成或轮询一个空的 tx 缓冲区插槽或类似的东西。炸开就行了。这将使您开始,然后如果您感兴趣,您可以稍后尝试做真实的事情。(其他目标中的其他 uart 可能更接近现实世界,需要一些初始化,并等待一个空的 tx buf)。
asm 使上述内容更加痛苦,只需将 C 用于低级/裸机程序即可。
此外,如果您使用 arm 裸机,您可以使用 arm-none-linux-gnueabi,如果您知道自己在做什么,但最终会发现 arm-none-eabi 更合适,因为您没有使用操作系统,更不用说 linux。