Wyświetlanie dwóch ciągów
Część sekcji Podstawy ścieżki Assembly w Coddy. Lekcja 40 z 45.
Wiesz już, jak wyświetlić jeden ciąg znaków. A co, jeśli chcesz wyświetlić dwa oddzielne ciągi znaków? Na przykład „Hello ”, a potem „World!”?
Po prostu wywołujesz dwukrotnie wywołanie systemowe write, po razie dla każdego ciągu znaków.
Jak to działa:
; Pierwsze wypisanie
mov rax, 1
mov rdi, 1
mov rsi, firstMsg
mov rdx, firstLen
syscall
; Drugie wypisanie
mov rax, 1
mov rdi, 1
mov rsi, secondMsg
mov rdx, secondLen
syscallPrzykład:
section .data
first db 'Hello ', 0x0a
firstLen equ $-first
second db 'World!', 0x0a
secondLen equ $-second
section .text
global _start
_start:
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
syscall
mov rax, 60
mov rdi, 0
syscallWynik:
Hello World!
Dlaczego drukować dwa ciągi zamiast jednego?
| Powód | Przykład |
|---|---|
| Ponowne użycie | Wydrukuj to samo powitanie z różnymi imionami |
| Elastyczność | Drukuj różne komunikaty w zależności od warunków |
| Organizacja | Przechowuj różne komunikaty osobno w pamięci |
Możesz wypisać dowolną liczbę ciągów znaków:
Po prostu powtórz wywołanie systemowe write dla każdego ciągu znaków.
Wyzwanie
Dane są dwa ciągi znaków: partOne o wartości 'Good' oraz partTwo o wartości 'bye'. Oba mają już znak nowej linii na końcu.
Napisz kod, który wyświetli partOne, a następnie partTwo, tak aby wynik wyglądał następująco:
Good
bye
Sekcja danych i wywołanie systemowe kończące program są już podane. Musisz napisać tylko dwa wywołania systemowe write.
Spróbuj swoich sił
section .data
partOne db 'Good', 0x0a
partOneLen equ $-partOne
partTwo db 'bye', 0x0a
partTwoLen equ $-partTwo
section .text
global _start
_start:
; TODO: Wypisz partOne za pomocą wywołania systemowego write
; TODO: Wypisz partTwo za pomocą wywołania systemowego write
mov rax, 60
mov rdi, 0
syscall
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