$ Sembolü
Coddy'nin Assembly Journey'sinin Temeller bölümünün bir parçası. Ders 29 / 45.
write syscall'ını (Bölüm 5) kullanarak bir string yazdırdığında, CPU'ya kaç bytes yazdıracağını söylemen gerekir.
Karakterleri elle sayabilirsin:
message db 'Hello', 0x0a ; 6 bayt (H e l l o newline)
mov rdx, 6 ; Manuel sayımAncak Manual sayma yavaştır ve hataya açıktır. string değerini değiştirirsen yeniden saymalı ve sayıyı güncellemelisin.
Çözüm: <strong>$</strong> kullanarak otomatik length hesaplama
$, konum sayacıdır. Bir sonraki byte'ı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 bytes depolandıktan sonra
$1006 olur $ - message= 1006 − 1000 = 6 (length)
Not: equ, equate ifadesinin kısaltmasıdır. 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 string'in kendi length değeri otomatik olarak hesaplanır. $, her hesaplama için sıfırlanır çünkü her zaman her string'in hemen sonrasındaki geçerli konumu ifade eder.
Görev
KolaySonunda yeni satır (0x0a) bulunan 'Paris' değerine sahip city adlı bir dize oluşturun. Ardından, $ - city kullanarak uzunluğu otomatik olarak hesaplayan cityLen adlı 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.
Temeller bölümündeki tüm dersler
Kendi başına pratik yap: Assembly playground