Symbol $
Część sekcji Podstawy ścieżki Assembly w Coddy. Lekcja 29 z 45.
Gdy wyświetlasz ciąg znaków za pomocą wywołania systemowego write (rozdział 5), musisz poinformować procesor, ile bajtów ma wyświetlić.
Możesz policzyć znaki ręcznie:
message db 'Hello', 0x0a ; 6 bajtów (H e l l o znak nowej linii)
mov rdx, 6 ; Ręczne zliczanieJednak ręczne liczenie jest powolne i podatne na błędy. Jeśli zmienisz ciąg znaków, musisz ponownie policzyć i zaktualizować liczbę.
Rozwiązanie: automatyczne obliczanie długości za pomocą $
$ to licznik lokalizacji. Reprezentuje bieżący adres pamięci, pod którym zostanie umieszczony następny bajt.
Przykład 1: Prosty ciąg znaków
section .data
message db 'Hello', 0x0a
msgLen equ $ - messageJak to działa:
messageto adres początkowy (na przykład: 1000)- Po zapisaniu 6 bajtów
$staje się równy 1006 $ - message= 1006 − 1000 = 6 (długość)
Uwaga: equ to skrót od equate. Tworzy stałą: nazwę reprezentującą wartość.
Przykład 2: Wiele ciągów znaków
section .data
first db 'Hi', 0x0a
len1 equ $ - first ; len1 = 3 ('H','i', znak nowej linii)
second db 'Hello', 0x0a
len2 equ $ - second ; len2 = 6 ('H','e','l','l','o', znak nowej linii)Długość każdego ciągu znaków jest obliczana automatycznie. $ jest resetowane przy każdym obliczeniu, ponieważ zawsze odnosi się do bieżącej pozycji zaraz za każdym ciągiem znaków.
Wyzwanie
ŁatwyUtwórz ciąg znaków o nazwie city z wartością 'Paris', po której następuje znak nowej linii (0x0a). Następnie utwórz stałą o nazwie cityLen, która automatycznie oblicza długość przy użyciu $ - city.
Spróbuj swoich sił
%include "data.asm"
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, city
mov rdx, cityLen
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ńczeniePoćwicz samodzielnie: Edytor online Assembly