Menu
Coddy logo textTech

Esercitazione: scambia i registri

Fa parte della sezione Fondamenti del percorso Assembly di Coddy. Lezione 21 di 45.

A volte devi scambiare i valori tra due registri. Per esempio, se rax contiene 5 e rbx contiene 10, dopo lo scambio rax dovrebbe contenere 10 e rbx dovrebbe contenere 5.

Non puoi farlo con una o due istruzioni MOV. Ti serve un terzo registro come memoria temporanea.

Perché non puoi farlo direttamente:

; Questo NON funziona
mov rax, rbx   ; Ora rax = 10, ma il 5 originale è perso per sempre
mov rbx, rax   ; Ora anche rbx = 10 (non 5)

Il metodo corretto: usare un registro temporaneo:

mov rcx, rax   ; Passaggio 1: salva il valore originale di rax in rcx (rcx = 5)
mov rax, rbx   ; Passaggio 2: copia rbx in rax (rax = 10)
mov rbx, rcx   ; Passaggio 3: copia il valore salvato in rcx in rbx (rbx = 5)

Passo dopo passo:

PassaggioIstruzioneraxrbxrcx
Inizio(prima di qualsiasi codice)510?
1mov rcx, rax5105
2mov rax, rbx10105
3mov rbx, rcx1055

Dopo queste tre istruzioni, i valori vengono scambiati. Il registro temporaneo rcx contiene ancora il valore originale (5), ma va bene così.

Il registro temporaneo può essere qualsiasi registro che non stai usando:

  • Puoi usare rcx, rdx, r8 o qualsiasi registro disponibile
  • Assicurati solo di non aver bisogno del valore originale in quel registro

Perché è importante:

Scambiare i valori è un'operazione comune negli algoritmi di ordinamento e nella manipolazione dei dati. Ti insegna a riflettere attentamente sull'ordine delle istruzioni MOV.

challenge icon

Sfida

Scrivi tre righe di assembly per scambiare i valori tra r8 e r9.

Valori iniziali (forniti dall’ambiente di test):

  • r8 inizia con 6
  • r9 inizia con 2

Dopo il tuo codice:

  • r8 dovrebbe essere 2
  • r9 dovrebbe essere 6

Usa r10 come registro temporaneo.

Provalo tu

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:
    ; Imposta i valori iniziali
    mov r8, 6
    mov r9, 2
    
    %include "solution.asm"       ; Qui va il codice dello studente per lo scambio
    
    ; Salva i valori per la stampa
    mov r12, r8
    mov r13, r9
    
    ; Stampa "r8 = "
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_r8
    mov rdx, msg_r8_len
    syscall
    
    ; Stampa il valore di r8
    mov rax, r12
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; Stampa un carattere di nuova riga
    mov rax, 1
    mov rdi, 1
    mov rsi, newline
    mov rdx, 1
    syscall
    
    ; Stampa "r9 = "
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_r9
    mov rdx, msg_r9_len
    syscall
    
    ; Stampa il valore di r9
    mov rax, r13
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; Stampa un carattere di nuova riga
    mov rax, 1
    mov rdi, 1
    mov rsi, newline
    mov rdx, 1
    syscall
    
    ; Esci
    mov rax, 60
    mov rdi, 0
    syscall
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fondamenti

Esercitati da solo: Playground Assembly