Сборка ARM с использованием Qemu

Ну, я искал во всем Интернете код, который будет запускаться с использованием arm-linux-gnueabi-as и qemu. Чтобы напечатать целочисленное значение. Из строки. Рутина поможет.

1 ответ

Очевидно, вы не обыскали весь интернет... потому что, если ничего, исходный код qemu содержит все ответы на ваши вопросы...

QEMU эмулирует системы. Вы пытаетесь сделать что-то голое по системе эмулированных рук? Или вы пытаетесь запустить операционную систему arm linux и в операционной системе создать программу в сборке, которая работает в операционной системе, работающей на qemu? если он последний, то он не имеет ничего общего с qemu, это вопрос операционной системы, а не вопрос qemu. и это не вопрос языка (asm), а вопрос операционной системы. ASM и низкий уровень две разные вещи. 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, закрыв окно консоли.

Регистр TX UART в цель VersatilePB Qemu находится по адресу 0x101f1000. Поскольку это симуляция, вы можете "просто попробовать" и выяснить, что запись по этому адресу без каких-либо реальных настроек UART "просто работает", и, будучи эмулированной системой, она, вероятно, мгновенно передает символ, поэтому вам не нужно ждать для его завершения или опроса пустого слота буфера TX или чего-то в этом роде. Просто взорвать. Это поможет вам начать, а затем вы можете попытаться сделать что-то реальное позже, если это будет интересно. (другие уарты в других целях могут быть ближе к реальному миру и требуют некоторой инициализации и ожидания пустого буфера передачи).

asm делает вышеперечисленное более болезненным, просто используйте вместо этого C для ваших программ низкого уровня / голого металла.

Кроме того, если вы используете голый металл, вы можете использовать arm-none-linux-gnueabi, если вы знаете, что делаете, но в конечном итоге лучше подойдет arm-none-eabi, так как вы не используете операционную систему намного меньше linux.

Другие вопросы по тегам