$ Sembolü
Coddy'nin Assembly Journey'sinin Temeller bölümünün bir parçası — ders 29 / 45.
Bir dizgiyi write sistem çağrısını (Bölüm 5) kullanarak yazdırdığınızda, CPU'ya kaç bayt yazdırılacağını söylemeniz gerekir.
Karakterleri manuel olarak sayabilirsiniz:
message db 'Hello', 0x0a ; 6 bayt (H e l l o yeni satır)
mov rdx, 6 ; Manuel sayımAncak manuel sayım yavaştır ve hata yapmaya müsaittir. Dizeyi değiştirirseniz, yeniden saymanız ve sayıyı güncellemeniz gerekir.
Çözüm: <strong>$lt;/strong> kullanarak otomatik uzunluk hesaplama
$, konum sayacıdır — bir sonraki baytın yerleştirileceği mevcut bellek adresini temsil eder.
Örnek 1: Basit dize
section .data
message db 'Hello', 0x0a
msgLen equ $ - messageNasıl çalışır:
messagebaşlangıç adresidir (örnek: 1000)- 6 bayt depoladıktan sonra,
$1006 olur $ - message= 1006 − 1000 = 6 (uzunluk)
Not: equ, equate anlamına gelir. Bir sabit oluşturur — bir değeri temsil eden bir isim.
Örnek 2: Birden fazla dize
section .data
first db 'Hi', 0x0a
len1 equ $ - first ; len1 = 3 ('H','i', yeni satır)
second db 'Hello', 0x0a
len2 equ $ - second ; len2 = 6 ('H','e','l','l','o', yeni satır)
Her dizenin kendi uzunluğu otomatik olarak hesaplanır. $ her hesaplama için sıfırlanır çünkü her zaman her dizenin hemen sonrasındaki mevcut konumu ifade eder.
Görev
KolayDeğeri 'Paris' olan ve ardından bir yeni satır (0x0a) gelen city adında bir dize oluşturun. Ardından, $ - city kullanarak uzunluğu otomatik olarak hesaplayan cityLen adında bir sabit oluşturun.
Kendin dene
%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
syscallBu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.