Znak nowej linii ma znaczenie
Część sekcji Podstawy ścieżki Assembly w Coddy. Lekcja 41 z 45.
Dodawałeś 0x0a (znak nowej linii) na końcu swoich ciągów znaków. Ale co się stanie, jeśli o nim zapomnisz?
Bez znaku nowej linii:
Tekst jest wyświetlany, ale kursor pozostaje w tym samym wierszu. Każdy kolejny wynik pojawi się tuż obok.
Przykład bez znaku nowej linii:
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
syscallWynik:
HelloWorld
Bez spacji. Bez nowej linii. Wszystko jest sklejone.
Z nową linią:
section .data
first db 'Hello', 0x0a
firstLen equ $ - first
second db 'World', 0x0a
secondLen equ $ - secondWynik:
Hello
World
Każdy ciąg znaków jest wyświetlany w osobnym wierszu.
Co robi znak nowej linii:
| Znak | ASCII | Działanie |
|---|---|---|
0x0a | 10 | Przenosi kursor na początek następnej linii |
Częste błędy związane ze znakami nowej linii:
| Błąd | Wynik |
|---|---|
| Brak znaku nowej linii | Tekst zlewa się w jedną linię |
| Znak nowej linii tylko na końcu ostatniego ciągu | Poprzednie ciągi zlewają się ze sobą, a ostatni przechodzi do następnej linii |
| Znak nowej linii w środku ciągu | Podziały wiersza pojawiają się w nieoczekiwanych miejscach |
Bezpieczna zasada:
Zawsze dodawaj 0x0a na końcu każdego ciągu znaków, który ma znaleźć się w osobnej linii.
Wyzwanie
Otrzymujesz trzy ciągi znaków bez znaków nowej linii. Twoim zadaniem jest wypisać je tak, aby pojawiły się w trzech osobnych wierszach.
Ciągi znaków to:
| Ciąg znaków | Wartość |
|---|---|
word1 | 'Apple' |
word2 | 'Banana' |
word3 | 'Cherry' |
Wymagania:
- Zdefiniuj każdy ciąg znaków ze znakiem nowej linii (
0x0a) na końcu - Automatycznie oblicz długość każdego ciągu znaków
- Wypisz wszystkie trzy ciągi znaków za pomocą wywołania systemowego write
- Zakończ działanie poprawnie kodem 0
Spróbuj swoich sił
section .data
; TODO: Zdefiniuj word1 jako 1. tekst podany w instrukcji, zakończony znakiem nowej linii
; TODO: Zdefiniuj word2 jako 2. tekst podany w instrukcji, zakończony znakiem nowej linii
; TODO: Zdefiniuj word3 jako 3. tekst podany w instrukcji, zakończony znakiem nowej linii
; TODO: Oblicz długość każdego ciągu znaków
section .text
global _start
_start:
; TODO: Wypisz word1
; TODO: Wypisz word2
; TODO: Wypisz word3
; TODO: Zakończ program poprawnie
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Podstawy
1Maszyna
Czym jest CPUPamięćRejestry a pamięćJak działają instrukcjeWzorzec dwóch plikówArchitektura x86-642Systemy liczbowe
Dlaczego system binarny?Liczby binarneZamiana z systemu dziesiętnego na binarnyDlaczego system szesnastkowy?Zamiana z systemu szesnastkowego na dziesiętnyZamiana z systemu dziesiętnego na szesnastkowyASCII i system szesnastkowy5Wywołanie systemowe zakończenia
Czym jest syscall?Wywołanie systemowe zakończenia (60)Kody zakończeniaPodsumowanie: prawidłowe zakończenie3Pierwsza instrukcja – MOV
Czym jest MOV?MOV z wartością natychmiastowąMOV między rejestramiMOV z pamięci do rejestruMOV z rejestru do pamięciLEA – załaduj adresMOV z różnymi rozmiaramiĆwiczenie: zamiana rejestrówPowtórka: wyzwanie MOV6Wywołanie systemowe write
Wywołanie systemowe write (1)Deskryptor pliku (rdi)Adres bufora (rsi)Liczba bajtów (rdx)Połączmy elementyWyświetlanie dwóch ciągówZnak nowej linii ma znaczeniePodsumowanie: konfiguracja writePoćwicz samodzielnie: Edytor online Assembly