MOV Bellekten Yazmaca
Coddy'nin Assembly Journey'sinin Temeller bölümünün bir parçası — ders 17 / 45.
Şu ana kadar, sayıları doğrudan yazmaçlara (immediate) taşıdınız ve yazmaçlar arasında değerleri kopyaladınız. Şimdi, bellekten bir yazmaca nasıl veri yükleneceğini öğreneceksiniz.
Bu neden önemlidir:
Bölüm 0'dan hatırlayın: CPU bellek ile doğrudan çalışamaz. Veriler önce yazmaçlara (registers) yüklenmelidir. Bunu şu şekilde yaparsınız.
Sözdizimi:
mov register, [address]Köşeli parantezler [ ] şu anlama gelir: "bu bellek adresine git ve orada saklanan değeri al."
Şöyle düşünün:
number bellek adresinde bir kutu olduğunu hayal edin. Bu kutunun içinde bir değer var, örneğin 5 sayısı. Şunu yazdığınızda:
mov al, [number] ; "number" bellek adresindeki değeri al içine yükleİşlemciye şunu söylüyorsunuz: "number adlı kutuya git, içindeki değer her neyse onu al (bu durumda 5) ve onu al kaydedicisine kopyala."
Bu komut yürütüldükten sonra, 5 değeri artık al içinde saklanır. number adresindeki kutunun içindeki orijinal değer orada kalır — silinmez.
Önemli kurallar:
| Kural | Açıklama |
|---|---|
| Kaynak bir bellek adresi olmalıdır | [label] veya [address] |
| Köşeli parantezler zorunludur | mov al, myNumber değeri değil, adresi yükler |
| Boyut eşleşmelidir | Eğer bellek bir bayt (byte) saklıyorsa, al kullanın (rax değil) |
Yaygın hata:
; Yanlış: myNumber'ın değerini değil, ADRESİNİ yükler
mov al, myNumber
; Doğru: myNumber adresinde saklanan DEĞERİ yükler
mov al, [myNumber]Görev
value bellek adresindeki değeri al yazmacına yüklemek için bir satır assembly kodu yazın.
Kendin dene
section .data
msg db 'al = '
msg_len equ $ - msg
section .bss
digit resb 1
section .text
global _start
_start:
; Öğrencinin kodu önce çalışır (al içine değer yükler)
%include "solution.asm"
; al'deki değeri kaydet
mov r12, rax
; "al = " yazdır
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msg_len
syscall
; al içindeki değeri yazdır
mov rax, r12
add rax, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; Çıkış
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.