Menu
Coddy logo textTech

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 :

ÉtapeInstructionraxrbxrcx
Début(avant tout code)510?
1mov rcx, rax5105
2mov rax, rbx10105
3mov rbx, rcx1055

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, r8 ou 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.

challenge icon

Défi

Écrivez trois lignes d'assembleur pour échanger les valeurs entre r8 et r9.

Valeurs initiales (fournies par le banc d'essai) :

  • r8 commence avec 6
  • r9 commence avec 2

Après votre code :

  • r8 devrait être 2
  • r9 devrait ê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
    syscall
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Fondamentaux