Byte-Anzahl (rdx)
Teil des Abschnitts Grundlagen der Assembly-Journey von Coddy — Lektion 38 von 45.
Du hast dem Betriebssystem mitgeteilt, wohin es ausgeben soll (rdi) und was es ausgeben soll (rsi). Jetzt musst du ihm mitteilen, wie viele Bytes ausgegeben werden sollen.
Das Register für die Byte-Anzahl ist rdx.
Warum benötigt das OS die Länge?
Das OS weiß nicht, wo Ihr String endet. Ohne eine Längenangabe würde es den Speicher unendlich lange weiterlesen. Die Länge sagt dem OS genau, wann es stoppen muss.
Beispiel:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rdx, msgLen ; rdx = Anzahl der auszugebenden BytesWas passiert, wenn die Länge falsch ist?
| Einstellung | Ergebnis |
|---|---|
| Zu kurz | Nur ein Teil des Strings wird ausgegeben |
| Zu lang | Das Betriebssystem liest über Ihren String hinaus in den Garbage-Speicher weiter – dies kann zur Ausgabe von Zufallszeichen oder zu einem Absturz führen |
| Null | Nichts wird ausgegeben |
Länge automatisch berechnen:
Sie haben bereits das $ - label Muster in Kapitel 3 gelernt:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg ; msgLen = 6 (Hello + Zeilenumbruch)Dies stellt sicher, dass die Länge immer korrekt ist, selbst wenn Sie die Zeichenfolge ändern.
Vollständiges Beispiel:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rax, 1 ; write Syscall
mov rdi, 1 ; stdout
mov rsi, msg ; Adresse des Strings
mov rdx, msgLen ; Anzahl der Bytes
syscallAufgabe
Ihnen wird eine Zeichenfolge namens color mit dem Wert 'Red' gefolgt von einem Zeilenumbruch gegeben. Eine Konstante namens colorLen wurde bereits mit $ - color definiert.
Schreiben Sie die Codezeile, die rdx unter Verwendung der Konstante colorLen auf die Länge der Zeichenfolge setzt.
Schreiben Sie nur die mov-Anweisung für rdx.
Probier es selbst
section .text
global _start
_start:
; Der Code des Schülers wird zuerst ausgeführt (setzt rdx)
%include "solution.asm"
mov rax, 1
mov rdi, 1
mov rsi, color
; rdx enthält bereits die Länge (aus dem Code des Schülers)
syscall
mov rax, 60
mov rdi, 0
syscallDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Grundlagen
1Die Maschine
Was ist eine CPUSpeicherRegister vs. SpeicherWie Befehle funktionierenZwei-Dateien-MusterDie x86-64 Architektur