Menu
Coddy logo textTech

Prática: Trocar Registradores

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

Às vezes você precisa trocar os valores entre dois registradores. Por exemplo, se rax contém 5 e rbx contém 10, após a troca rax deve ser 10 e rbx deve ser 5.

Você não pode fazer isso com uma ou duas instruções MOV. Você precisa de um terceiro registrador como armazenamento temporário.

Por que você não pode fazer isso diretamente:

; Isso NÃO funciona
mov rax, rbx   ; Agora rax = 10, mas o 5 original se foi para sempre
mov rbx, rax   ; Agora rbx também = 10 (não 5)

O método correto — usando um registrador temporário:

mov rcx, rax   ; Passo 1: Salva o rax original em rcx (rcx = 5)
mov rax, rbx   ; Passo 2: Copia rbx para rax (rax = 10)
mov rbx, rcx   ; Passo 3: Copia o valor salvo de rcx para rbx (rbx = 5)

Passo a passo:

PassoInstruçãoraxrbxrcx
Início(antes de qualquer código)510?
1mov rcx, rax5105
2mov rax, rbx10105
3mov rbx, rcx1055

Após essas três instruções, os valores são trocados. O registrador temporário rcx ainda contém o valor original (5), mas tudo bem.

O registrador temporário pode ser qualquer registrador que você não esteja usando:

  • Você pode usar rcx, rdx, r8, ou qualquer registrador disponível
  • Apenas certifique-se de que não precisa do valor original naquele registrador

Por que isso é importante:

Trocar valores é uma operação comum em algoritmos de ordenação e manipulação de dados. Isso ensina você a pensar cuidadosamente sobre a ordem das instruções MOV.

challenge icon

Desafio

Escreva três linhas de assembly para trocar os valores entre r8 e r9.

Valores iniciais (fornecidos pelo ambiente de teste):

  • r8 começa com 6
  • r9 começa com 2

Após o seu código:

  • r8 deve ser 2
  • r9 deve ser 6

Use r10 como seu registrador temporário.

Experimente você mesmo

section .data
    msg_r8 db 'r8 = '
    msg_r8_len equ $ - msg_r8
    msg_r9 db 'r9 = '
    msg_r9_len equ $ - msg_r9
    newline db 0xa

section .bss
    digit resb 1

section .text
    global _start

_start:
    ; Define valores iniciais
    mov r8, 6
    mov r9, 2
    
    %include "solution.asm"       ; O código de troca do aluno vai aqui
    
    ; Salva valores para impressão
    mov r12, r8
    mov r13, r9
    
    ; Imprime "r8 = "
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_r8
    mov rdx, msg_r8_len
    syscall
    
    ; Imprime o valor de r8
    mov rax, r12
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; Imprime nova linha
    mov rax, 1
    mov rdi, 1
    mov rsi, newline
    mov rdx, 1
    syscall
    
    ; Imprime "r9 = "
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_r9
    mov rdx, msg_r9_len
    syscall
    
    ; Imprime o valor de r9
    mov rax, r13
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; Imprime nova linha
    mov rax, 1
    mov rdi, 1
    mov rsi, newline
    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