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 também existem outros tamanhos. Diferentes registradores armazenam diferentes quantidades de dados.

As famílias de registradores x86-64:

RegistradorTamanhoBitsQuando usar
rax8 bytes64 bitsNúmeros completos, endereços, números de chamadas de sistema
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 (low)
rbxebxbxbl
rcxecxcxcl
rdxedxdxdl
rsiesisisil
rdiedididil

Por que o tamanho importa:

Ao mover dados, os tamanhos da origem e do destino devem corresponder. Se não corresponderem, a CPU poderá:

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

Exemplos de tamanhos correspondentes:

mov rax, 1000        ; 64 bits para 64 bits (ok)
mov eax, 1000        ; 32 bits para 32 bits (ok)
mov ax, 1000         ; 16 bits para 16 bits (ok)
mov al, 5            ; 8 bits para 8 bits (ok)

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 iguais. Isso pode causar resultados inesperados.

A regra segura:

Até agora, neste curso, todos os dados na memória têm 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 de source, armazena em destination)
    
    %include "solution.asm"
    
    ; Carrega o valor armazenado de destination
    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
    
    ; Sai
    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

Pratique por conta própria: Playground de Assembly