Byte-Anzahl (rdx)
Teil des Abschnitts Grundlagen der Assembly-Journey von Coddy. Lektion 38 von 45.
Du hast dem Betriebssystem mitgeteilt, wo es drucken soll (rdi) und was es drucken soll (rsi). Jetzt musst du ihm sagen, wie viele bytes es drucken soll.
Das Register für die Anzahl der bytes ist rdx.
Warum benötigt das Betriebssystem die Länge?
Das Betriebssystem weiß nicht, wo dein string endet. Ohne eine Länge würde es den Speicher für immer weiterlesen. Die Länge teilt dem Betriebssystem genau mit, wann es anhalten soll.
Beispiel:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rdx, msgLen ; rdx = Anzahl der zu druckenden BytesWas passiert, wenn die Länge falsch ist?
| Wenn du festlegst | Ergebnis |
|---|---|
| Zu kurz | Nur ein Teil des Strings wird ausgegeben |
| Zu lang | Das Betriebssystem liest hinter deinem String weiter im Speicher: Es werden möglicherweise zufällige Zeichen ausgegeben oder das Programm stürzt ab |
| Null | Es wird nichts ausgegeben |
Länge automatisch berechnen:
Du hast das Muster $ - label bereits in Kapitel 3 gelernt:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg ; msgLen = 6 (Hello + Zeilenumbruch)Dadurch ist die Länge immer korrekt, selbst wenn du den String änderst.
Vollständiges Beispiel:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rax, 1 ; write-Syscall
mov rdi, 1 ; Standardausgabe
mov rsi, msg ; Adresse des Strings
mov rdx, msgLen ; Anzahl der Bytes
syscallAufgabe
Gegeben ist eine Zeichenkette namens color mit dem Wert 'Red', gefolgt von einem Zeilenumbruch. Eine Konstante namens colorLen wurde bereits mithilfe von $ - color definiert.
Schreibe die Codezeile, die rdx mithilfe der Konstante colorLen auf die Länge der Zeichenkette setzt.
Schreibe nur die mov-Anweisung für rdx.
Probier es selbst
section .text
global _start
_start:
; Der Code des Studenten 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 (vom Code des Studenten)
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Übe selbstständig: Assembly-Playground