
Assembly Memo
In dieser Einheit werden wir sBPF Assembly verwenden, um einen Logging-Mechanismus für unser Programm zu erstellen.
Die Einfachheit eines kompakten Memo-Programms ist der perfekte Ausgangspunkt für deine sBPF-Assembly-Reise!
Wenn du mit Assembly-Programmierung nicht vertraut bist, folge dem Einführungskurs zu Assembly
Program Design
Unser Programm wird einfach den richtigen Speicherort in das richtige Register setzen und dann den sol_log_ Syscall ausführen. Es wird so aussehen:
.equ NUM_ACCOUNTS, 0x00
.equ DATA_LEN, 0x08
.equ DATA, 0x10
.globl entrypoint
entrypoint:
ldxdw r0, [r1+NUM_ACCOUNTS]
ldxdw r2, [r1+DATA_LEN]
add64 r1, DATA
call sol_log_
exitMemory Offsets
Das Programm beginnt mit der Deklaration von drei .equ Konstanten, die das Speicherlayout unserer Instruktionsdaten definieren:
.equ NUM_ACCOUNTS, 0x00 ; Offset for number of accounts
.equ DATA_LEN, 0x08 ; Offset for data length
.equ DATA, 0x10 ; Offset for actual dataDiese Konstanten markieren die Byte-Offsets relativ zum Entry-Buffer-Zeiger in r1:
NUM_ACCOUNTS(0x0000): Zeigt auf die Anzahl der Konten im Instruktionsdaten-Header zur ValidierungDATA_LEN(0x08): Zeigt auf die Länge der Instruktionsdaten im Instruktionsdaten-HeaderDATA(0x10): Zeigt auf die Instruktionsdaten im Instruktionsdaten-Header
Im Gegensatz zu höheren Programmiersprachen, die das Speicherlayout abstrahieren, erfordert Assembly genaue Kenntnis darüber, wo jedes Datenelement gespeichert ist.
Entrypoint and Initial Validation
.globl entrypoint
entrypoint:
ldxdw r0, [r1+NUM_ACCOUNTS] ; Load number of accounts into r0Jedes sBPF-Programm beginnt mit einem globalen .entrypoint Symbol. Die Solana-Laufzeitumgebung stellt Konto- und Instruktionsdaten über das Register r1 bereit.
Diese erste Anweisung lädt dann die Anzahl der Konten in r0. Da r0 das Register ist, das die VM beim Beenden liest, erfüllt dies zwei Zwecke:
Es lädt die Kontoanzahl für unsere Verwendung
Es stellt sicher, dass das Programm automatisch fehlschlägt, wenn Konten übergeben werden (Wert ungleich Null in r0)
Sol Log Syscall
Als nächstes bereiten wir die Argumente für den sol_log_ Syscall vor:
ldxdw r2, [r1+DATA_LEN] ; Load length of memo into r2
add64 r1, DATA ; Adjust r1 to point to memo bytesDiese Anweisungen richten die Argumente für sol_log_ ein:
r2erhält die Länge der Memo-Datenr1wird angepasst, um direkt auf die Memo-Bytes zu zeigen
Und danach rufen wir sol_log_ auf und beenden:
call 16 ; Call sol_log_ (helper ID 16)
exit ; Return using r0 valueFazit
Das Programm:
Ruft 16 (
sol_log_) auf, um das Memo im Validator-Log auszugebenBeendet mit dem Wert in
r0