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 devrait être 10 et rbx devrait être 5.
Vous ne pouvez pas faire cela avec une ou deux instructions MOV. Vous avez besoin d'un troisième registre comme stockage temporaire.
Pourquoi vous ne pouvez pas le faire directement :
; Cela ne fonctionne PAS
mov rax, rbx ; Maintenant rax = 10, mais le 5 original est perdu à jamais
mov rbx, rax ; Maintenant rbx = 10 également (pas 5)La méthode correcte — utiliser un registre temporaire :
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)Étape par étape :
| Étape | 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 d'origine (5), mais ce n'est pas grave.
Le registre temporaire 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 que vous n'avez pas besoin de la valeur d'origine dans ce registre
Pourquoi cela est important :
L'échange de valeurs est une opération courante dans les algorithmes de tri et la manipulation de données. Cela vous apprend à réfléchir attentivement à l'ordre des instructions MOV.
Défi
Écrivez trois lignes d'assembleur pour échanger les valeurs entre r8 et r9.
Valeurs initiales (fournies par le banc d'essai) :
r8commence avec 6r9commence avec 2
Après votre code :
r8devrait être 2r9devrait être 6
Utilisez r10 comme registre temporaire.
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 d'échange 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 un saut de 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 un saut de 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 MOV