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 swap os values between dois registradores. Por exemplo, se rax contém 5 e rbx contém 10, após o swap 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 register como temporary storage.

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 temporary:

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

Step a passo:

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

Após estas três instruções, os values são trocados. O temporary register rcx ainda contém o original (5), mas tudo bem.

O registro temporary pode ser qualquer registro que você não esteja usando:

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

Por que isso é importante:

Trocar values é 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 Initial (fornecidos pelo test harness):

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

Após seu código:

  • r8 deve ser 2
  • r9 deve ser 6

Use r10 como seu registrador temporary.

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 swap do aluno vai aqui
    
    ; Salva os 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

Pratique por conta própria: Playground de Assembly