Menu
Coddy logo textTech

Übung: Register tauschen

Teil des Abschnitts Grundlagen der Assembly-Journey von Coddy. Lektion 21 von 45.

Manchmal musst du die values zwischen zwei register swap. Zum Beispiel: Wenn rax den Wert 5 und rbx den Wert 10 enthält, sollte rax nach dem swap den Wert 10 und rbx den Wert 5 enthalten.

Du kannst das nicht mit einer oder zwei MOV-Instruktionen tun. Du brauchst ein drittes register als temporary storage.

Warum du es nicht direkt tun kannst:

; Das funktioniert NICHT
mov rax, rbx   ; Jetzt ist rax = 10, aber die ursprüngliche 5 ist für immer weg
mov rbx, rax   ; Jetzt ist rbx auch = 10 (nicht 5)

Die korrekte Methode: using ein temporary register:

mov rcx, rax   ; Schritt 1: Originales rax in rcx speichern (rcx = 5)
mov rax, rbx   ; Schritt 2: rbx in rax kopieren (rax = 10)
mov rbx, rcx   ; Schritt 3: Gespeicherten Wert von rcx in rbx kopieren (rbx = 5)

Step für Step:

StepAnweisungraxrbxrcx
Start(vor jedem Code)510?
1mov rcx, rax5105
2mov rax, rbx10105
3mov rbx, rcx1055

Nach diesen drei Anweisungen werden die values getauscht. Das temporary register rcx enthält weiterhin den original value (5), aber das ist in Ordnung.

Das temporäre Register kann jedes Register sein, das du nicht verwendest:

  • Du kannst rcx, rdx, r8 oder jedes verfügbare Register verwenden
  • Stelle einfach sicher, dass du den ursprünglichen Wert in diesem Register nicht benötigst

Warum das wichtig ist:

Das Austauschen von values ist eine häufige Operation in Sortieralgorithmen und bei der Datenmanipulation. Dabei lernst du, sorgfältig über die Reihenfolge von MOV-Anweisungen nachzudenken.

challenge icon

Aufgabe

Schreibe drei Assembly-Zeilen, um die Werte zwischen r8 und r9 zu vertauschen.

Anfangswerte (vom Test-Harness bereitgestellt):

  • r8 beginnt mit 6
  • r9 beginnt mit 2

Nach deinem Code:

  • r8 sollte 2 sein
  • r9 sollte 6 sein

Verwende r10 als temporäres Register.

Probier es selbst

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:
    ; Setze Anfangswerte
    mov r8, 6
    mov r9, 2
    
    %include "solution.asm"       ; Swap-Code des Studenten kommt hierher
    
    ; Speichere Werte zum Drucken
    mov r12, r8
    mov r13, r9
    
    ; Drucke "r8 = "
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_r8
    mov rdx, msg_r8_len
    syscall
    
    ; Drucke r8-Wert
    mov rax, r12
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; Drucke Zeilenumbruch
    mov rax, 1
    mov rdi, 1
    mov rsi, newline
    mov rdx, 1
    syscall
    
    ; Drucke "r9 = "
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_r9
    mov rdx, msg_r9_len
    syscall
    
    ; Drucke r9-Wert
    mov rax, r13
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; Drucke Zeilenumbruch
    mov rax, 1
    mov rdi, 1
    mov rsi, newline
    mov rdx, 1
    syscall
    
    ; Beenden
    mov rax, 60
    mov rdi, 0
    syscall
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Grundlagen

Übe selbstständig: Assembly-Playground