Unser erstes Programm (PI5)

Aus C und Assembler mit Raspberry

Unser erstes Programm wird zunächst nichts tun. Es wird einfach eine Dauerschleife durchlaufen. Dies dient als Grundbaustein für alle weiteren Versuche. Ich werde erklären, wie ein solches Programm erstellt, kompiliert und ausgeführt wird. Zunächst schauen wir, ob alles funktioniert.

Sourcecode erstellen

Öffnen Sie ein Textprogramm, um unser erstes Assemblerprogramm zu schreiben:

//
// The first program
// 01.07.2024 www.satyria.de
//
.section .init    // Ensure the linker places this at the beginning of the kernel image
.globl _start     // Generates a global label
_start:           // The label _start (entry address)

b main            // Branch to "main"

.section .text    // Instruction to the linker that code is coming

main:             // Create the label "main"
   mov sp, #0x80000 // Create a stack of 512KB (524288 bytes)
MainLoop:         // Infinite loop 
   b MainLoop

Speichern Sie die Datei im Standardverzeichnis unter Windows: C:\msys64\home\xxx (wobei xxx in der Regel Ihr Benutzername ist). Unter Linux können Sie die Datei im Home-Verzeichnis speichern. Geben Sie der Datei den Namen erstes.S. Die Endung .S kennzeichnet die Datei als Assembler-Sourcecode.

Kompilieren des Programms

Angenommen, Sie haben die Programmierumgebung wie im Kapitel „Programmierumgebung erstellen“ eingerichtet. Um das Programm zu kompilieren, öffnen Sie unter Windows „msys2“ (zu finden im Windows-Menü). Unter Linux öffnen Sie die Konsole. Wechseln Sie zum Home-Verzeichnis, falls Sie sich nicht bereits dort befinden. Dies können Sie mit dem Befehl cd ~ tun. Mit ls können Sie den Inhalt des Verzeichnisses anzeigen. Nun werden drei Befehle benötigt, um das Programm zu kompilieren:

aarch64-none-elf-as erstes.S -o erstes.o
aarch64-none-elf-ld --no-undefined erstes.o -o erstes.elf
aarch64-none-elf-objcopy erstes.elf -O binary kernel_2712.img

aarch64-none-elf-as: Erzeugt mit der Option -o eine Objektdatei (erstes.o). Dies ist der erste Schritt, da der Assembler eventuell noch nicht alle Informationen hat. aarch64-none-elf-ld: Der Linker erzeugt den eigentlichen Maschinencode und setzt Informationen zusammen, die im Code nicht deklariert wurden, und erzeugt die Datei erstes.elf. aarch64-none-elf-objcopy: Da der Raspberry Pi die elf-Datei im Ursprungszustand nicht versteht, wandelt dieser Befehl die Datei in ein binäres Format um, das der Raspberry Pi erwartet. Das Ergebnis ist die Datei kernel_2712.img.