MOV da registro a registro
Fa parte della sezione Fondamenti del percorso Assembly di Coddy. Lezione 16 di 45.
Ora che sai come inserire direttamente un numero in un registro (MOV immediato), puoi anche copiare i valori tra i registri.
Sintassi:
mov destination_register, source_registerIl valore del registro source viene copiato nel registro destination. Il registro di origine rimane invariato.
Esempio:
mov rax, 5 ; rax = 5
mov rbx, rax ; rbx = 5 (copiato da rax)Dopo queste due istruzioni, sia rax sia rbx contengono 5.
Importante: Il registro sorgente (rax) conserva ancora il suo valore. MOV copia: non taglia né sposta.
Un altro esempio:
mov rax, 7 ; rax = 7
mov rcx, 3 ; rcx = 3
mov rdx, rcx ; rdx = 3 (copiato da rcx)
mov rbx, rax ; rbx = 7 (copiato da rax)Dopo queste istruzioni:
| Registro | Valore |
|---|---|
| rax | 7 |
| rcx | 3 |
| rdx | 3 |
| rbx | 7 |
Perché è importante:
- Puoi salvare un valore copiandolo in un altro registro prima di modificare l'originale
- Puoi riutilizzare i valori senza caricarli di nuovo dalla memoria
- Questa è la base della maggior parte delle operazioni in assembly
Sfida
Scrivi il codice assembly per queste attività:
- Inserisci il numero 4 in
rax - Copia il valore da
raxinrbx - Copia il valore da
rbxinrcx
Al termine del tuo codice, tutti e tre i registri dovrebbero contenere 4.
Provalo tu
section .data
msg_rax db 'rax = '
msg_rax_len equ $ - msg_rax
msg_rbx db 'rbx = '
msg_rbx_len equ $ - msg_rbx
msg_rcx db 'rcx = '
msg_rcx_len equ $ - msg_rcx
section .bss
digit resb 1
section .text
global _start
_start:
%include "solution.asm"
; Salva i valori
mov r12, rax
mov r13, rbx
mov r14, rcx
; Stampa "rax = "
mov rax, 1
mov rdi, 1
mov rsi, msg_rax
mov rdx, msg_rax_len
syscall
; Stampa il valore di rax
mov rax, r12
add rax, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; Stampa "rbx = "
mov rax, 1
mov rdi, 1
mov rsi, msg_rbx
mov rdx, msg_rbx_len
syscall
; Stampa il valore di rbx
mov rax, r13
add rax, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; Stampa "rcx = "
mov rax, 1
mov rdi, 1
mov rsi, msg_rcx
mov rdx, msg_rcx_len
syscall
; Stampa il valore di rcx
mov rax, r14
add rax, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
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