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:
| Register | Boyut | Bitler | Ne zaman kullanılır |
|---|---|---|---|
rax | 8 bayt | 64 bit | Tam sayılar, adresler, sistem çağrısı numaraları |
eax | 4 bayt | 32 bit | rax değerinin alt yarısı |
ax | 2 bayt | 16 bit | eax değerinin alt yarısı |
al | 1 bayt | 8 bit | ax değerinin alt yarısı (0-7 bitleri) |
ah | 1 bayt | 8 bit | ax değerinin üst yarısı (8-15 bitleri) |
Aynı örüntü diğer yazmaçlar için de geçerlidir:
| 64-bit | 32-bit | 16-bit | 8-bit (low) |
|---|---|---|---|
rbx | ebx | bx | bl |
rcx | ecx | cx | cl |
rdx | edx | dx | dl |
rsi | esi | si | sil |
rdi | edi | di | dil |
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ırDaha 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,clvb. kullanın. - 8 bayt bellek →
rax,rbx,rcxvb. kullanın.
Bölüm 3'te farklı bellek boyutları hakkında bilgi edineceksin.
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:
sourceiçindeki değerialiçine yükleyin- Değeri
aliçindendestinationiç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
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