Menu
Coddy logo textTech

Farklı Boyutlarla MOV

Coddy'nin Assembly Journey'sinin Temel Bilgiler bölümünün bir parçası. Ders 20 / 45.

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

x86-64 register aileleri:

RegisterBoyutBitlerNe zaman kullanılır
rax8 bayt64 bitTam sayılar, adresler, sistem çağrısı numaraları
eax4 bayt32 bitrax değerinin alt yarısı
ax2 bayt16 biteax değerinin alt yarısı
al1 bayt8 bitax değerinin alt yarısı (0-7 bitleri)
ah1 bayt8 bitax değerinin üst yarısı (8-15 bitleri)

Aynı örüntü diğer yazmaçlar için de geçerlidir:

64-bit32-bit16-bit8-bit (low)
rbxebxbxbl
rcxecxcxcl
rdxedxdxdl
rsiesisisil
rdiedididil

Boyut neden önemlidir:

Verileri taşırken kaynak ve hedef boyutları eşleşmelidir. Eşleşmezlerse CPU şunları yapabilir:

  • Verilerin yalnızca bir kısmını kopyalamak
  • Bilinmeyen bellekten fazladan baytlar kopyalamak
  • Bir hataya neden olmak

Eşleşen boyut örnekleri:

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

Boyutlar eşleşmediğinde ne olur:

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

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

Güvenli kural:

Şimdiye kadar bu kursta bellekteki tüm veriler 1 bayttır. Bu nedenle al kullanırsın (rax değil).

Verileri taşırken, 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.

Bölüm 3'te farklı bellek boyutları hakkında bilgi edineceksin.

challenge icon

Görev

Bu veri adresleri zaten oluşturuldu:

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

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

  1. source içindeki değeri al içine yükleyin
  2. Değeri al içinden 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 (source'dan yükler, destination'a depolar)
    
    %include "solution.asm"
    
    ; destination'dan saklanan değeri yükle
    mov al, [destination]
    
    ; 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.

Temel Bilgiler bölümündeki tüm dersler

Kendi başına pratik yap: Assembly playground