$ Sembolü
Coddy'nin Assembly Journey'sinin Temel Bilgiler bölümünün bir parçası. Ders 29 / 45.
Bir dizeyi write sistem çağrısını (Bölüm 5) kullanarak yazdırdığınızda, CPU'ya kaç bayt yazdıracağını söylemeniz gerekir.
Karakterleri manuel olarak sayabilirdin:
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 hataya açıktır. Dizeyi değiştirirsen sayımı yeniden yapman ve sayıyı güncellemen gerekir.
Çözüm: $ kullanarak otomatik uzunluk hesaplama
$, konum sayacıdır. Bir sonraki baytın yerleştirileceği geçerli 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 depolandıktan sonra
$1006 olur $ - message= 1006 − 1000 = 6 (uzunluk)
Not: equ, eşitlemek anlamına gelir. Bir sabit oluşturur: bir değeri temsil eden bir ad.
Örnek 2: Birden çok 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 dizgenin kendi uzunluğu otomatik olarak hesaplanır. $ her hesaplama için sıfırlanır; çünkü her dizgeden hemen sonraki geçerli konumu ifade eder.
Görev
Kolaycity adında, ardından bir yeni satır (0x0a) gelen 'Paris' değerine sahip bir dize oluşturun. Ardından, uzunluğu $ - city kullanarak 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.
Temel Bilgiler bölümündeki tüm dersler
Kendi başına pratik yap: Assembly playground