Menu
Coddy logo textTech

MOV com Tamanhos Diferentes

Parte da seção Fundamentos do Journey de Assembly da Coddy — lição 20 de 45.

Você já usou al (8 bits) e rax (64 bits). Mas existem outros tamanhos também. Registradores diferentes armazenam diferentes quantidades de dados.

As famílias de registradores x86-64:

RegistradorTamanhoBitsQuando usar
rax8 bytes64 bitsNúmeros inteiros, endereços, números de syscall
eax4 bytes32 bitsMetade inferior de rax
ax2 bytes16 bitsMetade inferior de eax
al1 byte8 bitsMetade inferior de ax (bits 0-7)
ah1 byte8 bitsMetade superior de ax (bits 8-15)

O mesmo padrão se aplica a outros registradores:

64 bits32 bits16 bits8 bits (baixo)
rbxebxbxbl
rcxecxcxcl
rdxedxdxdl
rsiesisisil
rdiedididil

Por que o tamanho importa:

Quando você move dados, os tamanhos de origem e destino devem coincidir. Se eles não coincidirem, a CPU poderá:

  • Copiar apenas parte dos dados
  • Copiar bytes extras de memória desconhecida
  • Causar um erro

Exemplos de tamanhos correspondentes:

mov rax, 1000        ; 64-bit para 64-bit (correto)
mov eax, 1000        ; 32-bit para 32-bit (correto)
mov ax, 1000         ; 16-bit para 16-bit (correto)
mov al, 5            ; 8-bit para 8-bit (correto)

O que acontece com tamanhos incompatíveis:

mov rax, 0x123456789ABC   ; valor de 64 bits
mov al, 0xFF              ; al recebe 0xFF, os outros bits de rax permanecem inalterados

Quando você move um valor menor para um registrador maior, os bits superiores permanecem os mesmos. Isso pode causar resultados inesperados.

A regra de segurança:

Neste curso até agora, todos os dados na memória são de 1 byte. É por isso que você usa al (não rax).

Quando você move dados, o tamanho do registrador deve corresponder ao tamanho da memória:

  • 1 byte de memória → use al, bl, cl, etc.
  • 8 bytes de memória → use rax, rbx, rcx, etc.

Você aprenderá sobre diferentes tamanhos de memória no Capítulo 3.

challenge icon

Desafio

Você já tem estes endereços de dados criados:

  • source — contém um valor de 1 byte (5)
  • destination — espaço vazio (1 byte)

Escreva duas linhas de assembly para:

  1. Carregar o valor de source em al
  2. Armazenar o valor de al em destination

Experimente você mesmo

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

section .bss
    digit resb 1

section .text
    global _start

_start:
    ; O código do aluno é executado primeiro (carrega da origem, armazena no destino)
    
    %include "solution.asm"
    
    ; Carrega o valor armazenado do destino
    mov al, [destination]
    
    ; Salva-o
    mov r12, rax
    
    ; Imprime "destination = "
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, msg_len
    syscall
    
    ; Imprime o valor
    mov rax, r12
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; Sair
    mov rax, 60
    mov rdi, 0
    syscall
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Fundamentos