Menu
Coddy logo textTech

MOV con diferentes tamaños

Parte de la sección Fundamentos del Journey de Assembly de Coddy — lección 20 de 45.

Ya has usado al (8 bits) y rax (64 bits). Pero también hay otros tamaños. Diferentes registros contienen diferentes cantidades de datos.

Las familias de registros x86-64:

RegistroTamañoBitsCuándo usar
rax8 bytes64 bitsNúmeros completos, direcciones, números de syscall
eax4 bytes32 bitsMitad inferior de rax
ax2 bytes16 bitsMitad inferior de eax
al1 byte8 bitsMitad inferior de ax (bits 0-7)
ah1 byte8 bitsMitad superior de ax (bits 8-15)

El mismo patrón se aplica a otros registros:

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

Por qué el tamaño importa:

Cuando mueves datos, los tamaños de origen y destino deben coincidir. Si no coinciden, la CPU puede:

  • Copiar solo parte de los datos
  • Copiar bytes adicionales de memoria desconocida
  • Causar un error

Ejemplos de tamaños coincidentes:

mov rax, 1000        ; de 64 bits a 64 bits (bien)
mov eax, 1000        ; de 32 bits a 32 bits (bien)
mov ax, 1000         ; de 16 bits a 16 bits (bien)
mov al, 5            ; de 8 bits a 8 bits (bien)

Qué sucede con tamaños desiguales:

mov rax, 0x123456789ABC   ; valor de 64 bits
mov al, 0xFF              ; al obtiene 0xFF, los otros bits de rax permanecen sin cambios

Cuando mueves un valor más pequeño a un registro más grande, los bits superiores permanecen igual. Esto puede causar resultados inesperados.

La regla segura:

En este curso hasta ahora, todos los datos en memoria son de 1 byte. Por eso utilizas al (no rax).

Cuando mueves datos, el tamaño del registro debe coincidir con el tamaño de la memoria:

  • 1 byte de memoria → usa al, bl, cl, etc.
  • 8 bytes de memoria → usa rax, rbx, rcx, etc.

Aprenderás sobre los diferentes tamaños de memoria en Capítulo 3.

challenge icon

Desafío

Ya tienes estas direcciones de datos creadas:

  • source — contiene un valor de 1 byte (5)
  • destination — espacio vacío (1 byte)

Escribe dos líneas de ensamblador para:

  1. Cargar el valor de source en al
  2. Almacenar el valor de al en destination

Pruébalo tú mismo

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

section .bss
    digit resb 1

section .text
    global _start

_start:
    ; El código del estudiante se ejecuta primero (carga desde el origen, almacena en el destino)
    
    %include "solution.asm"
    
    ; Cargar el valor almacenado desde el destino
    mov al, [destination]
    
    ; Guardarlo
    mov r12, rax
    
    ; Imprimir "destination = "
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, msg_len
    syscall
    
    ; Imprimir el valor
    mov rax, r12
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; Salir
    mov rax, 60
    mov rdi, 0
    syscall
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Fundamentos