Ćwiczenie: zamiana rejestrów
Część sekcji Podstawy ścieżki Assembly w Coddy. Lekcja 21 z 45.
Czasami trzeba zamienić wartości między dwoma rejestrami. Na przykład, jeśli rax zawiera 5, a rbx zawiera 10, po zamianie rax powinien zawierać 10, a rbx powinien zawierać 5.
Nie możesz tego zrobić za pomocą jednej lub dwóch instrukcji MOV. Potrzebujesz trzeciego rejestru jako tymczasowego miejsca do przechowywania.
Dlaczego nie możesz zrobić tego bezpośrednio:
; To NIE działa
mov rax, rbx ; Teraz rax = 10, ale pierwotna wartość 5 została bezpowrotnie utracona
mov rbx, rax ; Teraz rbx również = 10 (a nie 5)Prawidłowa metoda: użycie rejestru tymczasowego:
mov rcx, rax ; Krok 1: Zapisz pierwotną wartość rax w rcx (rcx = 5)
mov rax, rbx ; Krok 2: Skopiuj wartość rbx do rax (rax = 10)
mov rbx, rcx ; Krok 3: Skopiuj zapisaną wartość z rcx do rbx (rbx = 5)Krok po kroku:
| Krok | Instrukcja | rax | rbx | rcx |
|---|---|---|---|---|
| Start | (przed wykonaniem jakiegokolwiek kodu) | 5 | 10 | ? |
| 1 | mov rcx, rax | 5 | 10 | 5 |
| 2 | mov rax, rbx | 10 | 10 | 5 |
| 3 | mov rbx, rcx | 10 | 5 | 5 |
Po wykonaniu tych trzech instrukcji wartości są zamienione miejscami. Rejestr tymczasowy rcx nadal zawiera pierwotną wartość (5), ale to nie problem.
Rejestrem tymczasowym może być dowolny rejestr, którego nie używasz:
- Możesz użyć
rcx,rdx,r8lub dowolnego dostępnego rejestru - Upewnij się tylko, że nie potrzebujesz pierwotnej wartości w tym rejestrze
Dlaczego to ważne:
Zamiana wartości to częsta operacja w algorytmach sortowania i manipulacji danymi. Uczy uważnego myślenia o kolejności instrukcji MOV.
Wyzwanie
Napisz trzy linie kodu asemblera, aby zamienić wartości między r8 a r9.
Wartości początkowe (dostarczone przez środowisko testowe):
r8zaczyna od 6r9zaczyna od 2
Po wykonaniu twojego kodu:
r8powinno mieć wartość 2r9powinno mieć wartość 6
Użyj r10 jako rejestru tymczasowego.
Spróbuj swoich sił
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:
; Ustaw wartości początkowe
mov r8, 6
mov r9, 2
%include "solution.asm" ; Tutaj znajduje się kod zamiany wartości napisany przez ucznia
; Zapisz wartości do wypisania
mov r12, r8
mov r13, r9
; Wypisz "r8 = "
mov rax, 1
mov rdi, 1
mov rsi, msg_r8
mov rdx, msg_r8_len
syscall
; Wypisz wartość r8
mov rax, r12
add rax, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; Wypisz znak nowej linii
mov rax, 1
mov rdi, 1
mov rsi, newline
mov rdx, 1
syscall
; Wypisz "r9 = "
mov rax, 1
mov rdi, 1
mov rsi, msg_r9
mov rdx, msg_r9_len
syscall
; Wypisz wartość r9
mov rax, r13
add rax, 48
mov [digit], al
mov rax, 1
mov rdi, 1
mov rsi, digit
mov rdx, 1
syscall
; Wypisz znak nowej linii
mov rax, 1
mov rdi, 1
mov rsi, newline
mov rdx, 1
syscall
; Zakończ
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