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 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 :

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

challenge icon

Défi

Écris trois lignes d’assembleur pour échanger les valeurs entre r8 et r9.

Valeurs Initial (fournies par le banc de test) :

  • r8 commence avec 6
  • r9 commence avec 2

Après ton code :

  • r8 devrait être égal à 2
  • r9 devrait ê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
    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

Entraînez-vous par vous-même : Playground Assembly