Bayt Sayısı (rdx)
Coddy'nin Assembly Journey'sinin Temeller bölümünün bir parçası — ders 38 / 45.
İşletim sistemine nereye yazdırılacağını (rdi) ve ne yazdırılacağını (rsi) söylediniz. Şimdi ona kaç bayt yazdırılacağını söylemeniz gerekiyor.
Bayt sayısı için kullanılan yazmaç rdx'tir.
OS neden uzunluğa ihtiyaç duyar?
OS, dizginizin nerede bittiğini bilmez. Bir uzunluk olmadan, belleği sonsuza kadar okumaya devam eder. Uzunluk, OS'ye tam olarak ne zaman duracağını söyler.
Örnek:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rdx, msgLen ; rdx = yazdırılacak bayt sayısıUzunluk yanlış olursa ne olur?
| Eğer şunu ayarlarsanız | Sonuç |
|---|---|
| Çok kısa | Dizenin yalnızca bir kısmı yazdırılır |
| Çok uzun | İşletim sistemi dizenizi geçip çöp belleğe (garbage memory) okumaya devam eder — rastgele karakterler yazdırabilir veya çökebilir |
| Sıfır | Hiçbir şey yazdırılmaz |
Uzunluğu otomatik olarak hesaplama:
Bölüm 3'te $ - label kalıbını zaten öğrenmiştiniz:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg ; msgLen = 6 (Hello + yeni satır)Bu, dizeyi değiştirseniz bile uzunluğun her zaman doğru olmasını sağlar.
Tam örnek:
section .data
msg db 'Hello', 0x0a
msgLen equ $ - msg
section .text
mov rax, 1 ; write sistem çağrısı
mov rdi, 1 ; stdout
mov rsi, msg ; dizginin adresi
mov rdx, msgLen ; bayt sayısı
syscallGörev
Size, değeri 'Red' olan ve ardından bir yeni satır karakteri gelen color adında bir dize verilmiştir. $ - color kullanılarak colorLen adında bir sabit zaten tanımlanmıştır.
colorLen sabitini kullanarak rdx kaydını dizenin uzunluğuna ayarlayan kod satırını yazın.
Sadece rdx için mov talimatını yazın.
Kendin dene
section .text
global _start
_start:
; Öğrencinin kodu önce çalışır (rdx'i ayarlar)
%include "solution.asm"
mov rax, 1
mov rdi, 1
mov rsi, color
; rdx zaten uzunluğa sahip (öğrencinin kodundan gelen)
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.