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 deverá ser 10 e rbx deverá 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: Salve o rax original em rcx (rcx = 5)
mov rax, rbx ; Passo 2: Copie rbx para rax (rax = 10)
mov rbx, rcx ; Passo 3: Copie 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 isso não é um problema.
O registrador temporário pode ser qualquer registrador que você não esteja usando:
- Você pode usar
rcx,rdx,r8ou qualquer registrador disponível - Apenas certifique-se de que não precisa do valor original nesse registrador
Por que isso importa:
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 harness de testes):
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 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
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 MOVPratique por conta própria: Playground de Assembly