Newline ist wichtig
Teil des Abschnitts Grundlagen der Assembly-Journey von Coddy. Lektion 41 von 45.
Sie haben am Ende Ihrer Strings bisher 0x0a (newline) hinzugefügt. Aber was passiert, wenn Sie es vergessen?
Ohne newline:
Der Text wird gedruckt, aber der Cursor bleibt auf derselben Zeile. Jede zukünftige Ausgabe erscheint direkt daneben.
Beispiel ohne Neue-Zeile-Zeichen (newline):
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 newline. Alles ist aneinandergefügt.
Mit Newline:
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 gedruckt.
Was newline bewirkt:
| Zeichen | ASCII | Wirkung |
|---|---|---|
0x0a | 10 | Bewegt den Cursor an den Anfang der nächsten Zeile |
Häufige `newline`-Fehler:
| Fehler | Ergebnis |
|---|---|
| Überhaupt kein `newline` | Text läuft auf einer Zeile zusammen |
| `newline` nur am Ende des letzten Strings | Vorherige Strings laufen zusammen, der letzte geht in die nächste Zeile |
| `newline` in der Mitte eines Strings | Zeilenumbrüche an unerwarteten Stellen |
Die sichere Regel:
Füge am Ende jedes Strings, der in einer eigenen Zeile stehen soll, immer 0x0a hinzu.
Aufgabe
Ihnen werden drei Zeichenketten ohne Zeilenumbrüche gegeben. Ihre Aufgabe ist es, diese so auszugeben, dass sie auf drei separaten Zeilen erscheinen.
Die Zeichenketten lauten:
| String | Wert |
|---|---|
word1 | 'Apple' |
word2 | 'Banana' |
word3 | 'Cherry' |
Anforderungen:
- Definieren Sie jede Zeichenkette mit einem Zeilenumbruch (
0x0a) am Ende - Berechnen Sie die Länge jeder Zeichenkette automatisch
- Geben Sie alle drei Zeichenketten mit dem write-
syscallaus - Beenden Sie das Programm sauber mit Code 0
Probier es selbst
section .data
; TODO: Definiere word1 mit dem 1. Text aus den Anweisungen und Zeilenumbruch
; TODO: Definiere word2 mit dem 2. Text aus den Anweisungen und Zeilenumbruch
; TODO: Definiere word3 mit dem 3. Text aus den Anweisungen und Zeilenumbruch
; TODO: Berechne die Längen für jeden String
section .text
global _start
_start:
; TODO: Gib word1 aus
; TODO: Gib word2 aus
; TODO: Gib word3 aus
; TODO: Sauber beenden section .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Übe selbstständig: Assembly-Playground