5

好吧,我已经在整个互联网上搜索了将使用 arm-linux-gnueabi-as 和 qemu 运行的代码。打印一个整数值。从字符串。例行公事会有所帮助。

4

1 回答 1

15

显然你没有搜索整个互联网......因为,如果没有别的,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。

于 2013-04-04T05:22:32.817 回答