Pratique : Échanger des registres
Fait partie de la section Fondamentaux du Journey Assembly de Coddy. Leçon 21 sur 45.
Parfois, vous devez échanger les valeurs entre deux registres. Par exemple, si rax contient 5 et rbx contient 10, après l’échange, rax doit être égal à 10 et rbx doit être égal à 5.
Vous ne pouvez pas faire cela avec une ou deux instructions MOV. Vous avez besoin d’un troisième registre comme stockage temporary.
Pourquoi vous ne pouvez pas le faire directement :
; Ceci ne fonctionne PAS
mov rax, rbx ; Maintenant rax = 10, mais le 5 original a disparu pour toujours
mov rbx, rax ; Maintenant rbx vaut aussi 10 (pas 5)La méthode correcte : using un temporary register :
mov rcx, rax ; Étape 1 : Sauvegarder le rax original dans rcx (rcx = 5)
mov rax, rbx ; Étape 2 : Copier rbx dans rax (rax = 10)
mov rbx, rcx ; Étape 3 : Copier la valeur sauvegardée de rcx dans rbx (rbx = 5)Step par étape :
| Step | Instruction | rax | rbx | rcx |
|---|---|---|---|---|
| Début | (avant tout code) | 5 | 10 | ? |
| 1 | mov rcx, rax | 5 | 10 | 5 |
| 2 | mov rax, rbx | 10 | 10 | 5 |
| 3 | mov rbx, rcx | 10 | 5 | 5 |
Après ces trois instructions, les valeurs sont échangées. Le registre temporaire rcx contient toujours la valeur original (5), mais ce n’est pas un problème.
Le registre temporary peut être n’importe quel registre que vous n’utilisez pas :
- Vous pouvez utiliser
rcx,rdx,r8ou n’importe quel registre disponible - Assurez-vous simplement de ne pas avoir besoin de la valeur original dans ce registre
Pourquoi c'est important :
Échanger des values est une opération courante dans les algorithmes de tri et la manipulation des données. Cela t'apprend à réfléchir attentivement à l'ordre des instructions MOV.
Défi
Écris trois lignes d’assembleur pour échanger les valeurs entre r8 et r9.
Valeurs Initial (fournies par le banc de test) :
r8commence avec 6r9commence avec 2
Après ton code :
r8devrait être égal à 2r9devrait être égal à 6
Utilise r10 comme registre temporary.
Essayez vous-même
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:
; Définir les valeurs initiales
mov r8, 6
mov r9, 2
%include "solution.asm" ; Le code de swap de l'étudiant va ici
; Sauvegarder les valeurs pour l'affichage
mov r12, r8
mov r13, r9
; Afficher "r8 = "
mov rax, 1
mov rdi, 1
mov rsi, msg_r8
mov rdx, msg_r8_len
syscall
; Afficher la valeur de r8
mov rax, r12
add rax, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; Afficher une nouvelle ligne
mov rax, 1
mov rdi, 1
mov rsi, newline
mov rdx, 1
syscall
; Afficher "r9 = "
mov rax, 1
mov rdi, 1
mov rsi, msg_r9
mov rdx, msg_r9_len
syscall
; Afficher la valeur de r9
mov rax, r13
add rax, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; Afficher une nouvelle ligne
mov rax, 1
mov rdi, 1
mov rsi, newline
mov rdx, 1
syscall
; Quitter
mov rax, 60
mov rdi, 0
syscallCette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Fondamentaux
1La Machine
Qu'est-ce qu'un CPULa mémoireRegistres vs MémoireFonctionnement des instructionsLe modèle à deux fichiersL'architecture x86-643Première instruction - MOV
Qu'est-ce que MOV ?MOV ImmédiatMOV de Registre à RegistreMOV de la Mémoire vers un RegistreMOV d'un Registre vers la MémoireLEA - Charger l'adresseMOV avec différentes taillesPratique : Échanger des registresRécapitulatif : Défi MOVEntraînez-vous par vous-même : Playground Assembly