Menu
Coddy logo textTech

MOV con dimensioni diverse

Fa parte della sezione Fondamenti del percorso Assembly di Coddy. Lezione 20 di 45.

Hai già usato al (8 bit) e rax (64 bit). Ma esistono anche altre dimensioni. Registri diversi possono contenere quantità diverse di dati.

Le famiglie di registri x86-64:

RegistroDimensioneBitQuando usarlo
rax8 byte64 bitNumeri completi, indirizzi, numeri di syscall
eax4 byte32 bitMetà inferiore di rax
ax2 byte16 bitMetà inferiore di eax
al1 byte8 bitMetà inferiore di ax (bit 0-7)
ah1 byte8 bitMetà superiore di ax (bit 8-15)

Lo stesso schema si applica agli altri registri:

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

Perché la dimensione è importante:

Quando sposti i dati, le dimensioni della sorgente e della destinazione dovrebbero corrispondere. Se non corrispondono, la CPU potrebbe:

  • Copiare solo una parte dei dati
  • Copiare byte aggiuntivi da una memoria sconosciuta
  • Causare un errore

Esempi di dimensioni corrispondenti:

mov rax, 1000        ; Da 64 bit a 64 bit (va bene)
mov eax, 1000        ; Da 32 bit a 32 bit (va bene)
mov ax, 1000         ; Da 16 bit a 16 bit (va bene)
mov al, 5            ; Da 8 bit a 8 bit (va bene)

Cosa succede con dimensioni non corrispondenti:

mov rax, 0x123456789ABC   ; valore a 64 bit
mov al, 0xFF              ; al riceve 0xFF, gli altri bit di rax rimangono invariati

Quando sposti un valore più piccolo in un registro più grande, i bit superiori restano invariati. Questo può causare risultati imprevisti.

La regola sicura:

Finora, in questo corso, tutti i dati in memoria occupano 1 byte. Ecco perché usi al (non rax).

Quando sposti i dati, la dimensione del registro deve corrispondere alla dimensione della memoria:

  • 1 byte di memoria → usa al, bl, cl, ecc.
  • 8 byte di memoria → usa rax, rbx, rcx, ecc.

Imparerai a conoscere le diverse dimensioni della memoria nel capitolo 3.

challenge icon

Sfida

Hai già creato questi indirizzi dati:

  • source: contiene un valore di 1 byte (5)
  • destination: spazio vuoto (1 byte)

Scrivi due righe di assembly per:

  1. Caricare il valore da source in al
  2. Memorizzare il valore da al in destination

Provalo tu

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

section .bss
    digit resb 1

section .text
    global _start

_start:
    ; Il codice dello studente viene eseguito per primo (carica da source e memorizza in destination)
    
    %include "solution.asm"
    
    ; Carica il valore memorizzato in destination
    mov al, [destination]
    
    ; Salvalo
    mov r12, rax
    
    ; Stampa "destination = "
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, msg_len
    syscall
    
    ; Stampa il valore
    mov rax, r12
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; Esci
    mov rax, 60
    mov rdi, 0
    syscall
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fondamenti

Esercitati da solo: Playground Assembly