Liczba bajtów (rdx)
Część sekcji Podstawy ścieżki Assembly w Coddy. Lekcja 38 z 45.
Powiedziano systemowi operacyjnemu, gdzie wypisać (rdi) i co wypisać (rsi). Teraz musisz powiedzieć mu, ile bajtów wypisać.
Rejestrem przechowującym liczbę bajtów jest rdx.
Dlaczego system operacyjny potrzebuje długości?
System operacyjny nie wie, gdzie kończy się Twój ciąg znaków. Bez podania długości czytałby pamięć w nieskończoność. Długość dokładnie wskazuje systemowi operacyjnemu, kiedy ma przestać.
Przykład:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rdx, msgLen ; rdx = liczba bajtów do wypisaniaCo się stanie, jeśli długość jest nieprawidłowa?
| Jeśli ustawisz | Wynik |
|---|---|
| Za małą wartość | Wypisze się tylko część ciągu znaków |
| Za dużą wartość | System operacyjny odczytuje dane poza ciągiem znaków, z nieużywanej pamięci: może wypisać losowe znaki lub ulec awarii |
| Zero | Nic się nie wypisze |
Automatyczne obliczanie długości:
W rozdziale 3 poznano już wzorzec $ - label:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg ; msgLen = 6 (Hello + znak nowej linii)Dzięki temu długość jest zawsze prawidłowa, nawet jeśli zmienisz ciąg znaków.
Kompletny przykład:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rax, 1 ; wywołanie systemowe write
mov rdi, 1 ; stdout
mov rsi, msg ; adres ciągu znaków
mov rdx, msgLen ; liczba bajtów
syscallWyzwanie
Dany jest ciąg znaków o nazwie color z wartością 'Red', po której następuje znak nowej linii. Stała o nazwie colorLen została już zdefiniowana za pomocą $ - color.
Napisz linię kodu, która ustawia rdx na długość ciągu znaków, używając stałej colorLen.
Napisz tylko instrukcję mov dla rdx.
Spróbuj swoich sił
section .text
global _start
_start:
; Kod ucznia wykonuje się jako pierwszy (ustawia rdx)
%include "solution.asm"
mov rax, 1
mov rdi, 1
mov rsi, color
; rdx zawiera już długość (ustaloną przez kod ucznia)
syscall
mov rax, 60
mov rdi, 0
syscallTa 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