MOV między rejestrami
Część sekcji Podstawy ścieżki Assembly w Coddy. Lekcja 16 z 45.
Teraz, gdy wiesz już, jak bezpośrednio umieścić liczbę w rejestrze (MOV immediate), możesz także kopiować wartości między rejestrami.
Składnia:
mov destination_register, source_registerWartość z rejestru źródłowego zostaje skopiowana do rejestru docelowego. Rejestr źródłowy pozostaje bez zmian.
Przykład:
mov rax, 5 ; rax = 5
mov rbx, rax ; rbx = 5 (skopiowano z rax)Po tych dwóch instrukcjach zarówno rax, jak i rbx zawierają 5.
Ważne: Rejestr źródłowy (rax) nadal przechowuje swoją wartość. MOV kopiuje — nie wycina ani nie przenosi.
Kolejny przykład:
mov rax, 7 ; rax = 7
mov rcx, 3 ; rcx = 3
mov rdx, rcx ; rdx = 3 (skopiowane z rcx)
mov rbx, rax ; rbx = 7 (skopiowane z rax)Po tych instrukcjach:
| Rejestr | Wartość |
|---|---|
| rax | 7 |
| rcx | 3 |
| rdx | 3 |
| rbx | 7 |
Dlaczego to ważne:
- Możesz zapisać wartość, kopiując ją do innego rejestru, zanim zmienisz oryginał
- Możesz ponownie używać wartości bez ponownego wczytywania ich z pamięci
- To podstawa większości operacji w asemblerze
Wyzwanie
Napisz kod asemblera wykonujący te zadania:
- Umieść liczbę 4 w
rax - Skopiuj wartość z
raxdorbx - Skopiuj wartość z
rbxdorcx
Po wykonaniu kodu wszystkie trzy rejestry powinny zawierać 4.
Spróbuj swoich sił
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"
; Zapisz wartości
mov r12, rax
mov r13, rbx
mov r14, rcx
; Wypisz "rax = "
mov rax, 1
mov rdi, 1
mov rsi, msg_rax
mov rdx, msg_rax_len
syscall
; Wypisz wartość rax
mov rax, r12
add rax, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; Wypisz "rbx = "
mov rax, 1
mov rdi, 1
mov rsi, msg_rbx
mov rdx, msg_rbx_len
syscall
; Wypisz wartość rbx
mov rax, r13
add rax, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; Wypisz "rcx = "
mov rax, 1
mov rdi, 1
mov rsi, msg_rcx
mov rdx, msg_rcx_len
syscall
; Wypisz wartość rcx
mov rax, r14
add rax, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; Zakończ program
mov rax, 60
mov rdi, 0
syscallTa lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Podstawy
1Maszyna
Czym jest CPUPamięćRejestry a pamięćJak działają instrukcjeWzorzec dwóch plikówArchitektura x86-642Systemy liczbowe
Dlaczego system binarny?Liczby binarneZamiana z systemu dziesiętnego na binarnyDlaczego system szesnastkowy?Zamiana z systemu szesnastkowego na dziesiętnyZamiana z systemu dziesiętnego na szesnastkowyASCII i system szesnastkowy5Wywołanie systemowe zakończenia
Czym jest syscall?Wywołanie systemowe zakończenia (60)Kody zakończeniaPodsumowanie: prawidłowe zakończenie3Pierwsza instrukcja – MOV
Czym jest MOV?MOV z wartością natychmiastowąMOV między rejestramiMOV z pamięci do rejestruMOV z rejestru do pamięciLEA – załaduj adresMOV z różnymi rozmiaramiĆwiczenie: zamiana rejestrówPowtórka: wyzwanie MOVPoćwicz samodzielnie: Edytor online Assembly