Arm 使用Qemu组装手臂

Arm 使用Qemu组装手臂,arm,qemu,low-level-io,low-level-code,Arm,Qemu,Low Level Io,Low Level Code,我在整个互联网上搜索了使用arm linux gnueabi as和qemu运行的代码。 打印一个整数值。从字符串。例行公事会有帮助。显然,您没有搜索整个互联网……因为,如果没有其他内容,qemu源代码包含您问题的所有答案 QEMU模拟系统。您是否正在尝试在模拟的arm系统上进行裸机操作?或者您正在尝试运行arm linux操作系统,并在操作系统中创建一个在qemu上运行的操作系统上运行的程序集?如果是后者,则与qemu无关,这是一个操作系统问题,而不是qemu问题。这不是一个语言问题(asm)

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

显然,您没有搜索整个互联网……因为,如果没有其他内容,qemu源代码包含您问题的所有答案

QEMU模拟系统。您是否正在尝试在模拟的arm系统上进行裸机操作?或者您正在尝试运行arm linux操作系统,并在操作系统中创建一个在qemu上运行的操作系统上运行的程序集?如果是后者,则与qemu无关,这是一个操作系统问题,而不是qemu问题。这不是一个语言问题(asm),而是一个操作系统问题。asm和low level是两个不同的东西。asm并不意味着低级别的访问,对于低级别的内容,它绝对不是必需的(并且很少使用)

如果您对操作系统不感兴趣,而只是对裸机感兴趣,那么以下是在qemu控制台上获得串行输出的多种方法之一。字符串和整数等都是无语言问题(同样的解决方案可以应用于任何编程语言,asm、c、python等解决问题,然后将语言应用于问题)

开始

.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

versatilepb qemu目标中的uart tx寄存器位于地址0x101f1000处。因为这是一个模拟,所以您可以“尝试”并发现在不进行任何实际uart设置的情况下写入此地址“正常工作”,并且作为一个模拟系统,它可能会立即传输字符,因此您不必等待字符完成或轮询空的tx缓冲槽或类似的内容。快去吧。这会让你开始,然后你可以尝试做现实世界的东西,如果你感兴趣的话。(其他目标中的其他UART可能更接近真实世界,例如,需要一些初始化,并等待空的tx buf)

asm使上述操作更加痛苦,只需在低级/裸机程序中使用C即可


另外,如果你使用arm裸机,你可以使用arm none linux gnueabi,如果你知道你在做什么,但最终会发现arm none eabi更适合你,因为你使用的操作系统比linux少得多。

我认为人们对这个问题投了反对票,因为它缺乏一些研究。顺便说一句,这个问题有一个很好的答案,我看到了。因此,我决定将这个问题向上投票,这样它将保留在网络上,不会接近。谢谢,回答得很好。谢谢@dwelch给出的这个好答案,你能告诉我在你的例子中memmap文件的用法吗?我在这里称memmap只是一个gnu链接器(ld)链接器脚本,通常使用文件扩展名.ld,但我还没有遵守这个习惯…它告诉链接器在链接时在内存中放置东西的位置,程序在哪里,数据在哪里,等等。在这种情况下,所有程序都没有数据。文本是真正需要的所有链接器脚本。如果使用
-nographic
选项,则可以通过Ctrl-a和x停止进程。请注意,它不是Ctrl-a-x。首先释放这对,然后按x。我为此挣扎了整整十分钟。a表示“a”键,而不是alt键。现在qemu没有
-nographic
(即是图形),带有
-monitor stdio
,允许您在启动qemu退出的终端中键入“退出”。