Übung: Register tauschen
Teil des Abschnitts Grundlagen der Assembly-Journey von Coddy. Lektion 21 von 45.
Manchmal musst du die Werte zwischen zwei Registern austauschen. Wenn zum Beispiel rax den Wert 5 und rbx den Wert 10 enthält, sollte rax nach dem Austauschen den Wert 10 und rbx den Wert 5 enthalten.
Du kannst dies nicht mit einer oder zwei MOV-Anweisungen erledigen. Du benötigst ein drittes Register als temporären Speicher.
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: Verwendung eines temporären Registers:
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)Schritt für Schritt:
| Schritt | Anweisung | rax | rbx | rcx |
|---|---|---|---|---|
| Start | (vor jeglichem Code) | 5 | 10 | ? |
| 1 | mov rcx, rax | 5 | 10 | 5 |
| 2 | mov rax, rbx | 10 | 10 | 5 |
| 3 | mov rbx, rcx | 10 | 5 | 5 |
Nach diesen drei Anweisungen werden die Werte vertauscht. Das temporäre Register rcx enthält weiterhin den ursprünglichen Wert (5), aber das ist in Ordnung.
Das temporäre Register kann jedes Register sein, das du nicht verwendest:
- Du kannst
rcx,rdx,r8oder 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 Vertauschen von Werten ist eine häufige Operation in Sortieralgorithmen und bei der Datenverarbeitung. Dabei lernst du, sorgfältig über die Reihenfolge von MOV-Anweisungen nachzudenken.
Aufgabe
Schreibe drei Assembly-Zeilen, um die Werte zwischen r8 und r9 zu vertauschen.
Anfangswerte (vom Test-Harness bereitgestellt):
r8beginnt mit 6r9beginnt mit 2
Nach deinem Code:
r8sollte 2 seinr9sollte 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
syscallDiese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Grundlagen
1Die Maschine
Was ist eine CPUSpeicherRegister vs. SpeicherWie Befehle funktionierenZwei-Dateien-MusterDie x86-64 Architektur3Erster Befehl - MOV
Was ist MOV?MOV ImmediateMOV Register zu RegisterMOV Speicher zu RegisterMOV Register zu SpeicherLEA - Adresse ladenMOV mit verschiedenen GrößenÜbung: Register tauschenRückblick: MOV ChallengeÜbe selbstständig: Assembly-Playground