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 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 (low)
rbxebxbxbl
rcxecxcxcl
rdxedxdxdl
rsiesisisil
rdiedididil

Por que o tamanho importa:

Quando você move data, os tamanhos de source e destination devem corresponder. Se não corresponderem, a CPU pode:

  • 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 upper stay the same. 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