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:
| Passo | Instrução | rax | rbx | rcx |
|---|---|---|---|---|
| Início | (antes de qualquer código) | 5 | 10 | ? |
| 1 | mov rcx, rax | 5 | 10 | 5 |
| 2 | mov rax, rbx | 10 | 10 | 5 |
| 3 | mov rbx, rcx | 10 | 5 | 5 |
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.
Desafio
Escreva três linhas de assembly para trocar os valores entre r8 e r9.
Valores iniciais (fornecidos pelo ambiente de teste):
r8começa com 6r9começa com 2
Após o seu código:
r8deve ser 2r9deve 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
syscallEsta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Fundamentos
1A Máquina
O que é CPUMemóriaRegistradores vs MemóriaComo as instruções funcionamPadrão de Dois ArquivosA Arquitetura x86-643Primeira instrução - MOV
O que é MOV?MOV ImediatoMOV Registrador para RegistradorMOV Memória para RegistradorMOV Registrador para MemóriaLEA - Carregar EndereçoMOV com Tamanhos DiferentesPrática: Trocar RegistradoresRecapitulação: Desafio MOV