Simbol $
Termasuk bagian Dasar-Dasar dalam perjalanan Assembly di Coddy. Pelajaran 29 dari 45.
Saat mencetak string menggunakan syscall write (Bab 5), kamu perlu memberi tahu CPU berapa banyak byte yang harus dicetak.
Kamu bisa menghitung karakter secara manual:
message db 'Hello', 0x0a ; 6 byte (H e l l o baris baru)
mov rdx, 6 ; Penghitungan manualNamun, menghitung secara manual lambat dan rentan terhadap kesalahan. Jika kamu mengubah string, kamu harus menghitung ulang dan memperbarui angkanya.
Solusi: penghitungan panjang otomatis menggunakan $
$ adalah penghitung lokasi. Ini mewakili alamat memori saat ini tempat byte berikutnya akan ditempatkan.
Contoh 1: string sederhana
section .data
message db 'Hello', 0x0a
msgLen equ $ - messageCara kerjanya:
messageadalah alamat awal (contoh: 1000)- Setelah menyimpan 6 byte,
$menjadi 1006 $ - message= 1006 − 1000 = 6 (panjangnya)
Catatan: equ adalah singkatan dari equate. Ini membuat konstanta: nama yang mewakili sebuah nilai.
Contoh 2: Beberapa string
section .data
first db 'Hi', 0x0a
len1 equ $ - first ; len1 = 3 ('H','i', baris baru)
second db 'Hello', 0x0a
len2 equ $ - second ; len2 = 6 ('H','e','l','l','o', baris baru)Setiap string memiliki panjangnya sendiri yang dihitung secara otomatis. $ diatur ulang untuk setiap perhitungan karena selalu merujuk pada posisi saat ini tepat setelah setiap string.
Tantangan
MudahBuat string bernama city dengan nilai 'Paris' diikuti baris baru (0x0a). Lalu buat konstanta bernama cityLen yang menghitung panjang secara otomatis menggunakan $ - city.
Coba sendiri
%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
syscallPelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Dasar-Dasar
Latihan sendiri: Playground Assembly