Menu
Coddy logo textTech

Ć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:

KrokInstrukcjaraxrbxrcx
Start(przed wykonaniem jakiegokolwiek kodu)510?
1mov rcx, rax5105
2mov rax, rbx10105
3mov rbx, rcx1055

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, r8 lub 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.

challenge icon

Wyzwanie

Napisz trzy linie kodu asemblera, aby zamienić wartości między r8 a r9.

Wartości początkowe (dostarczone przez środowisko testowe):

  • r8 zaczyna od 6
  • r9 zaczyna od 2

Po wykonaniu twojego kodu:

  • r8 powinno mieć wartość 2
  • r9 powinno 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
    syscall
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Podstawy

Poćwicz samodzielnie: Edytor online Assembly