Bayt Sayısı (rdx)
Coddy'nin Assembly Journey'sinin Temel Bilgiler bölümünün bir parçası. Ders 38 / 45.
OS'ye nereye yazdıracağını (rdi) ve ne yazdıracağını (rsi) söyledin. Şimdi ona yazdıracağı byte sayısını söylemen gerekiyor.
Byte sayısı için kullanılan register rdx'dir.
İşletim sistemi neden uzunluğa ihtiyaç duyar?
İşletim sistemi dizenizin nerede bittiğini bilmez. Uzunluk olmadan belleği sonsuza kadar okumaya devam ederdi. Uzunluk, işletim sistemine 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ışsa ne olur?
| Ayarlarsanız | Sonuç |
|---|---|
| Çok kısa | Dizenin yalnızca bir kısmı yazdırılır |
| Çok uzun | İşletim sistemi dizenizi aşarak çöp belleği 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 öğrendin:
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 ; standart çıktı
mov rsi, msg ; dizenin adresi
mov rdx, msgLen ; bayt sayısı
syscallGörev
Bir satır sonunun ardından 'Red' değerine sahip color adlı bir dize verilmiştir. $ - color kullanılarak colorLen adlı bir sabit zaten tanımlanmıştır.
colorLen sabitini kullanarak rdx değerini dizenin uzunluğuna ayarlayan kod satırını yazın.
Yalnızca rdx için mov yönergesini 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)
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