Newline ist wichtig
Teil des Abschnitts Grundlagen der Assembly-Journey von Coddy — Lektion 41 von 45.
Sie haben am Ende Ihrer Strings 0x0a (Zeilenumbruch) hinzugefügt. Aber was passiert, wenn Sie es vergessen?
Ohne Zeilenumbruch:
Der Text wird ausgegeben, aber der Cursor bleibt in derselben Zeile. Jede zukünftige Ausgabe erscheint direkt daneben.
Beispiel ohne Zeilenumbruch:
section .data
first db 'Hello'
firstLen equ $ - first
second db 'World'
secondLen equ $ - second
section .text
mov rax, 1
mov rdi, 1
mov rsi, first
mov rdx, firstLen
syscall
mov rax, 1
mov rdi, 1
mov rsi, second
mov rdx, secondLen
syscallAusgabe:
HelloWorld
Kein Leerzeichen. Kein Zeilenumbruch. Alles ist zusammengeschrieben.
Mit Zeilenumbruch:
section .data
first db 'Hello', 0x0a
firstLen equ $ - first
second db 'World', 0x0a
secondLen equ $ - secondAusgabe:
Hello
World
Jeder String wird in einer eigenen Zeile ausgegeben.
Was ein Zeilenumbruch bewirkt:
| Zeichen | ASCII | Effekt |
|---|---|---|
0x0a | 10 | Bewegt den Cursor an den Anfang der nächsten Zeile |
Häufige Zeilenumbruch-Fehler:
| Fehler | Ergebnis |
|---|---|
| Überhaupt kein Zeilenumbruch | Text läuft in einer Zeile zusammen |
| Zeilenumbruch nur am Ende des letzten Strings | Vorherige Strings laufen zusammen, der letzte geht in die nächste Zeile |
| Zeilenumbruch in der Mitte eines Strings | Zeilenumbrüche an unerwarteten Stellen |
Die sichere Regel:
Fügen Sie immer 0x0a am Ende jeder Zeichenfolge hinzu, die in einer eigenen Zeile stehen soll.
Aufgabe
Sie erhalten drei Zeichenfolgen ohne Zeilenumbrüche. Ihre Aufgabe ist es, diese so auszugeben, dass sie in drei separaten Zeilen erscheinen.
Die Zeichenfolgen sind:
| Zeichenfolge | Wert |
|---|---|
word1 | 'Apple' |
word2 | 'Banana' |
word3 | 'Cherry' |
Anforderungen:
- Definieren Sie jede Zeichenfolge mit einem Zeilenumbruch (
0x0a) am Ende - Berechnen Sie die Länge jeder Zeichenfolge automatisch
- Geben Sie alle drei Zeichenfolgen mit dem write syscall aus
- Beenden Sie das Programm sauber mit dem Code 0
Probier es selbst
section .data
; TODO: Definiere word1 mit 'Apple' und Zeilenumbruch
; TODO: Definiere word2 mit 'Banana' und Zeilenumbruch
; TODO: Definiere word3 mit 'Cherry' und Zeilenumbruch
; TODO: Berechne die Längen für jede Zeichenkette
section .text
global _start
_start:
; TODO: Gib word1 aus
; TODO: Gib word2 aus
; TODO: Gib word3 aus
; TODO: Sauber beendensection .data
word1 db 'Apple', 0x0a
word1Len equ $ - word1
word2 db 'Banana', 0x0a
word2Len equ $ - word2
word3 db 'Cherry', 0x0a
word3Len equ $ - word3
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, word1
mov rdx, word1Len
syscall
mov rax, 1
mov rdi, 1
mov rsi, word2
mov rdx, word2Len
syscall
mov rax, 1
mov rdi, 1
mov rsi, word3
mov rdx, word3Len
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