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:
| Step | 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 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,r8ou 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.
Desafio
Escreva três linhas de assembly para trocar os valores entre r8 e r9.
Valores Initial (fornecidos pelo test harness):
r8começa com 6r9começa com 2
Após seu código:
r8deve ser 2r9deve 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
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