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ç | Boyut | Bit | Ne zaman kullanılır |
|---|---|---|---|
rax | 8 bayt | 64 bit | Tam sayılar, adresler, sistem çağrısı (syscall) numaraları |
eax | 4 bayt | 32 bit | rax'in alt yarısı |
ax | 2 bayt | 16 bit | eax'in alt yarısı |
al | 1 bayt | 8 bit | ax'in alt yarısı (0-7. bitler) |
ah | 1 bayt | 8 bit | ax'in üst yarısı (8-15. bitler) |
Aynı model diğer yazmaçlar için de geçerlidir:
| 64-bit | 32-bit | 16-bit | 8-bit (düşük) |
|---|---|---|---|
rbx | ebx | bx | bl |
rcx | ecx | cx | cl |
rdx | edx | dx | dl |
rsi | esi | si | sil |
rdi | edi | di | dil |
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ırDaha 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,clvb. kullanın. - 8 bayt bellek →
rax,rbx,rcxvb. kullanın.
Farklı bellek boyutlarını Bölüm 3'te öğreneceksiniz.
Görev
Zaten oluşturulmuş şu veri adreslerine sahipsiniz:
source— 1 baytlık bir değer (5) içerirdestination— boş alan (1 bayt)
Şunları yapmak için iki satır assembly kodu yazın:
sourceiçindeki değerialiçine yükleyinaliçindeki değeridestinationiç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
syscallBu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.