【问题标题】:ARM assembly using Qemu [closed]使用 Qemu 的 ARM 汇编 [关闭]
【发布时间】:2013-03-26 00:40:23
【问题描述】:

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

【问题讨论】:

  • 我认为人们对这个问题投了反对票,因为它缺乏一些研究。顺便说一句,这个问题有我见过的一个很好的答案。所以我决定对这个问题投赞成票,这样它就会留在网上而不是关闭。

标签: arm qemu low-level-io low-level-code


【解决方案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。

【讨论】:

  • 谢谢,很好的回答。
  • 感谢@dwelch 的这个好答案,你能告诉我在你的例子中使用 memmap 文件吗?
  • 我在这里所说的 memmap 只是一个 gnu 链接器 (ld) 链接器脚本,通常带有文件扩展名 .ld 但我还没有遵循这个习惯......它告诉链接器放置的位置当它链接时,内存中的东西,程序去哪里,数据去哪里等等。在这种情况下,所有程序都没有数据,因此 .text 是真正需要的所有链接描述文件。
  • 如果你使用-nographic选项,你可以通过Ctrl-a然后x来停止进程。请注意,它不是 Ctrl-a-x。您首先释放该对,然后按 x。我为此挣扎了整整十分钟。 a 表示“A”键,not alt.
  • 这些天 qemu without -nographic(即是图形),-monitor stdio 允许您在启动 qemu 的终端中输入“quit”退出。跨度>
猜你喜欢
  • 1970-01-01
  • 2019-05-17
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多