Menu
Coddy logo textTech

Übung: Register tauschen

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

Manchmal müssen Sie die Werte zwischen zwei Registern vertauschen. Wenn zum Beispiel rax den Wert 5 enthält und rbx den Wert 10 enthält, sollte nach dem Vertauschen rax 10 sein und rbx 5 sein.

Dies ist mit einem oder zwei MOV-Befehlen nicht möglich. Sie benötigen ein drittes Register als Zwischenspeicher.

Warum man es nicht direkt machen kann:

; 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 — Verwendung eines temporären Registers:

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

Schritt für Schritt:

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

Nach diesen drei Anweisungen sind die Werte vertauscht. Das temporäre Register rcx enthält immer noch den ursprünglichen Wert (5), aber das ist in Ordnung.

Das temporäre Register kann jedes Register sein, das Sie nicht verwenden:

  • Sie können rcx, rdx, r8 oder jedes verfügbare Register verwenden
  • Stellen Sie einfach sicher, dass Sie den ursprünglichen Wert in diesem Register nicht benötigen

Warum das wichtig ist:

Das Vertauschen von Werten ist eine häufige Operation in Sortieralgorithmen und bei der Datenmanipulation. Es lehrt Sie, sorgfältig über die Reihenfolge von MOV-Anweisungen nachzudenken.

challenge icon

Aufgabe

Schreiben Sie drei Zeilen Assembly, um die Werte zwischen r8 und r9 zu vertauschen.

Anfangswerte (bereitgestellt durch die Testumgebung):

  • r8 beginnt mit 6
  • r9 beginnt mit 2

Nach Ihrem Code:

  • r8 sollte 2 sein
  • r9 sollte 6 sein

Verwenden Sie r10 als Ihr 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:
    ; Initialwerte setzen
    mov r8, 6
    mov r9, 2
    
    %include "solution.asm"       ; Der Swap-Code des Schülers kommt hierher
    
    ; Werte für die Ausgabe speichern
    mov r12, r8
    mov r13, r9
    
    ; "r8 = " ausgeben
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_r8
    mov rdx, msg_r8_len
    syscall
    
    ; r8-Wert ausgeben
    mov rax, r12
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; Zeilenumbruch ausgeben
    mov rax, 1
    mov rdi, 1
    mov rsi, newline
    mov rdx, 1
    syscall
    
    ; "r9 = " ausgeben
    mov rax, 1
    mov rdi, 1
    mov rsi, msg_r9
    mov rdx, msg_r9_len
    syscall
    
    ; r9-Wert ausgeben
    mov rax, r13
    add rax, 48
    mov [digit], al
    mov rax, 1
    mov rdi, 1
    mov rsi, digit
    mov rdx, 1
    syscall
    
    ; Zeilenumbruch ausgeben
    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