Menu
Coddy logo textTech

Farklı Boyutlarla MOV

Coddy'nin Assembly Journey'sinin Temeller bölümünün bir parçası — ders 20 / 45.

Zaten al (8 bit) ve rax (64 bit) kullandınız. Ancak başka boyutlar da var. Farklı yazmaçlar farklı miktarlarda veri tutar.

x86-64 yazmaç aileleri:

YazmaçBoyutBitNe zaman kullanılır
rax8 bayt64 bitTam sayılar, adresler, sistem çağrısı (syscall) numaraları
eax4 bayt32 bitrax'in alt yarısı
ax2 bayt16 biteax'in alt yarısı
al1 bayt8 bitax'in alt yarısı (0-7. bitler)
ah1 bayt8 bitax'in üst yarısı (8-15. bitler)

Aynı model diğer yazmaçlar için de geçerlidir:

64-bit32-bit16-bit8-bit (düşük)
rbxebxbxbl
rcxecxcxcl
rdxedxdxdl
rsiesisisil
rdiedididil

Boyut neden önemlidir:

Veri taşıdığınızda, kaynak ve hedef boyutları eşleşmelidir. Eğer eşleşmezlerse, CPU şunları yapabilir:

  • Verinin sadece bir kısmını kopyalayabilir
  • Bilinmeyen bellekten fazladan baytlar kopyalayabilir
  • Bir hataya neden olabilir

Eşleşen boyut örnekleri:

mov rax, 1000        ; 64-bit'ten 64-bit'e (sorunsuz)
mov eax, 1000        ; 32-bit'ten 32-bit'e (sorunsuz)
mov ax, 1000         ; 16-bit'ten 16-bit'e (sorunsuz)
mov al, 5            ; 8-bit'ten 8-bit'e (sorunsuz)

Uyumsuz boyutlarda ne olur:

mov rax, 0x123456789ABC   ; 64-bit değer
mov al, 0xFF              ; al 0xFF değerini alır, rax'in diğer bitleri değişmeden kalır

Daha küçük bir değeri daha büyük bir kaydediciye taşıdığınızda, üst bitler aynı kalır. Bu, beklenmedik sonuçlara yol açabilir.

Güvenli kural:

Bu kursta şimdiye kadar, bellekteki tüm veriler 1 bayttır. Bu yüzden al (rax değil) kullanıyorsunuz.

Veri taşıdığınızda, yazmaç boyutu bellek boyutuyla eşleşmelidir:

  • 1 bayt bellek → al, bl, cl vb. kullanın.
  • 8 bayt bellek → rax, rbx, rcx vb. kullanın.

Farklı bellek boyutlarını Bölüm 3'te öğreneceksiniz.

challenge icon

Görev

Zaten oluşturulmuş şu veri adreslerine sahipsiniz:

  • source — 1 baytlık bir değer (5) içerir
  • destination — boş alan (1 bayt)

Şunları yapmak için iki satır assembly kodu yazın:

  1. source içindeki değeri al içine yükleyin
  2. al içindeki değeri destination içine kaydedin

Kendin dene

section .data
    msg db 'destination = '
    msg_len equ $ - msg

section .bss
    digit resb 1

section .text
    global _start

_start:
    ; Öğrencinin kodu önce çalışır (kaynaktan yükler, hedefe depolar)
    
    %include "solution.asm"
    
    ; Depolanan değeri hedeften yükle
    mov al, [destination]
    
    ; Onu kaydet
    mov r12, rax
    
    ; "destination = " yazdır
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, msg_len
    syscall
    
    ; 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
    syscall
quiz iconKendini test et

Bu 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