la
Pseudoelementlyszt.net behandelt la und andere RISC-V-Befehle ausführlicher.
Beschreibung
la lädt die Adresse von etwas in ein Register. Diese Adresse ist eine Speicherstelle, und der an dieser Stelle gespeicherte Wert ist eine separate Sache. Der Name steht für load address (Adresse laden).
Wenn Sie Daten im Speicher reservieren, geben Sie ihnen einen Namen wie arr oder msg, was Ihnen erspart, rohe Adressnummern zu verfolgen. Dieser Name ist ein Label, ein lesbarer Ersatz für eine Speicheradresse. Die nächste Zeile lädt die durch das Label arr gekennzeichnete Adresse in t0. Sie liefert die Stelle, an der das Array beginnt, und liest nicht den Inhalt des Arrays.
la t0, arr
Die Lade- und Speicherbefehle (lw, sw und die übrigen) nehmen eine Adresse entgegen, die in einem Register gehalten wird. Bevor Sie benannte Daten lesen oder schreiben können, muss ihre Adresse in einem Register stehen, und la legt sie dort ab. Das Lesen des Werts erfordert zwei Befehle. la findet heraus, wo die Daten sind, und lw liest, was dort steht.
Das RISC-V-Handbuch beschreibt auipc als den Befehl zum Aufbau pc-relativer Adressen. Es stellt fest, dass ein auipc, gefolgt von einem Lade- oder Speicherbefehl mit einem 12-Bit-Offset, jede 32-Bit-pc-relative Datenadresse erreichen kann.
Eine Adresse und ihr Inhalt unterscheiden sich auf dieselbe Weise, wie sich ein Zeiger und ein Wert unterscheiden. Nachdem die Adresse in einem Register steht, erreichen Sie einzelne Elemente, indem Sie Offsets dazu addieren. Das Beispiel lädt die Adresse eines Textstücks in a0, was der Dienst zum Ausgeben von Zeichenketten benötigt. Ihm muss gesagt werden, wo der Text ist, und es liest den Text von dort. la ist eine Pseudoinstruktion, die der Assembler aus ein paar echten Befehlen aufbaut.
Wird erweitert zu
auipc rd, hi(label) addi rd, rd, lo(label)
Der Assembler ersetzt diese Pseudoanweisung durch die oben aufgeführte(n) echte(n) Anweisung(en).
Beispiel
.data msg: .string "hi" .text la a0, msg # a0 = address of msg
