Сборка 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.