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:
| Passaggio | Istruzione | rax | rbx | rcx |
|---|---|---|---|---|
| Inizio | (prima di qualsiasi codice) | 5 | 10 | ? |
| 1 | mov rcx, rax | 5 | 10 | 5 |
| 2 | mov rax, rbx | 10 | 10 | 5 |
| 3 | mov rbx, rcx | 10 | 5 | 5 |
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,r8o 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.
Sfida
Scrivi tre righe di assembly per scambiare i valori tra r8 e r9.
Valori iniziali (forniti dall’ambiente di test):
r8inizia con 6r9inizia con 2
Dopo il tuo codice:
r8dovrebbe essere 2r9dovrebbe 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
syscallQuesta lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Fondamenti
1La macchina
Che cos’è la CPUMemoriaRegistri vs memoriaCome funzionano le istruzioniSchema a due fileL’architettura x86-642Sistemi numerici
Perché il binario?Numeri binariDa decimale a binarioPerché l'esadecimale?Da esadecimale a decimaleDa decimale a esadecimaleASCII ed esadecimale5Chiamata di sistema di uscita
Cos'è una chiamata di sistema?Chiamata di sistema di uscita (60)Codici di uscitaRiepilogo: uscita corretta3Prima istruzione - MOV
Che cos'è MOV?MOV immediatoMOV da registro a registroMOV da memoria a registroMOV da registro a memoriaLEA - Carica indirizzoMOV con dimensioni diverseEsercitazione: scambia i registriRiepilogo: sfida MOVEsercitati da solo: Playground Assembly