ARM汇编使用Qemu

7

我在整个互联网上搜索了使用arm-linux-gnueabi-as和qemu运行的代码,以打印一个整数值。从字符串中提取。可以使用以下例程:


2
我认为人们对这个问题进行了负评,因为它缺乏一些研究。顺便说一下,这个问题有一个我见过的好答案。所以我决定给这个问题点赞,这样它就会保留在网络上而不被关闭。 - sandun dhammika
1个回答

16
显然你没有搜索整个互联网......因为,如果没有其他事情,QEMU源代码包含了你的所有问题的答案...
QEMU模拟系统。你是在模拟的arm系统上尝试裸机编程吗?还是尝试运行一个arm Linux操作系统,并在其中创建一个在运行在QEMU上的操作系统中的汇编程序?如果是后者,这与QEMU无关,这是一个操作系统问题而不是QEMU问题。它也不是语言问题(asm),而是操作系统问题。汇编和低级是两个不同的东西。汇编并不意味着低级访问,绝对不需要(且很少使用)低级东西。
如果您对操作系统不感兴趣,只需要进行裸机操作,那么以下是许多方法之一可以在QEMU控制台上获得串行输出。字符串和整数等都是一种无需语言的问题(任何编程语言,如asm、c、python等都可以解决问题,然后将语言应用于问题)。
start.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

memmap

MEMORY
{
    rom  : ORIGIN = 0x00010000, LENGTH = 32K
}

SECTIONS
{
   .text : { *(.text*) } > rom
}

Makefile

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)。
使用汇编使上述过程更加繁琐,请改用C语言来编写您的低级/裸机程序。
另外,如果要进行arm bare metal,则可以使用arm-none-linux-gnueabi,如果您知道自己在做什么,但最终会发现arm-none-eabi更适合您,因为您根本没有使用操作系统,更不用说linux了。

感谢@dwelch提供这个好答案,您能告诉我在您的示例中memmap文件的用途吗? - Amit Singh Tomar
我在这里所谓的memmap其实就是一个gnu链接器(ld)链接脚本,通常具有.ld文件扩展名,但我还没有遵循这个习惯...它告诉链接器在链接时将东西放置在内存中的位置,程序放在哪里,数据放在哪里等等。在这种情况下,它全部都是程序而没有数据,因此.text是链接脚本所需的全部内容。 - old_timer
如果您使用-nographic选项,可以通过Ctrl-a然后x停止进程。请注意,它不是Ctrl-a-x。您需要先释放组合键,然后再按x。我曾经为此苦苦挣扎了十分钟。而a表示的是'A'键,不是alt键。 - Dan P
1
现在,使用带有-monitor stdio的qemu 而不是 -nographic(即有图形界面),允许您在启动qemu的终端中键入“quit”以退出。 - duanev
"CROSS_COMPILE ?= arm-linux-gnueabi" 适用于我。哪个Ubuntu软件包提供了arm-none*? - selden
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接