使用Qemu的ARM程序集

Waq*_*qas 4 arm qemu low-level-code low-level-io

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

old*_*mer 13

显然你没有搜索整个互联网...因为,如果没有别的,qemu源代码包含你的问题的所有答案...

QEMU模拟系统.你想在模拟手臂系统上做一些裸机吗?或者您是否正在尝试运行arm linux操作系统并在操作系统内创建程序集中的程序,该程序在qemu上运行的操作系统上运行?如果它是后者,它与qemu无关,它是一个操作系统问题而不是qemu问题.它不是一个语言问题(asm),而是一个操作系统问题.asm和low level是两回事.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
Run Code Online (Sandbox Code Playgroud)

MEMMAP

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

SECTIONS
{
   .text : { *(.text*) } > rom
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

跟着跑

qemu-system-arm -M versatilepb -m 128M -nographic -kernel hello_world.bin
Run Code Online (Sandbox Code Playgroud)

但我不知道怎么走出控制台

相反,如果你这样做:

qemu-system-arm -M versatilepb -m 128M -kernel hello_world.bin
Run Code Online (Sandbox Code Playgroud)

然后ctrl-alt-3(不是F3但是3)将切换到串行控制台,你可以看到输出,并可以通过关闭控制台窗口关闭qemu.

versatilepb qemu目标中的uart tx寄存器位于地址0x101f1000.因为这是一个模拟,你可以"只是尝试"并发现写入这个地址而不做任何真实世界的uart设置"只是工作",并且作为一个模拟系统它可能会立即传输角色所以你不必等待它可以完成或轮询一个空的tx缓冲槽或类似的东西.爆炸了.这将让你开始,然后如果感兴趣的话,你可以尝试以后做现实世界的事情.(其他目标中的其他uart可能更接近现实世界,需要一些初始化,并等待空tx buf).

asm使上面的内容更加痛苦,只需使用C代替你的低级/裸机程序.

另外,如果做手臂裸机,你可以使用arm-none-linux-gnueabi,如果你知道你在做什么,但最终会发现arm-none-eabi更合适,因为你没有使用操作系统而不是linux.