Ü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:
| Step | Anweisung | rax | rbx | rcx |
|---|---|---|---|---|
| Start | (vor jedem 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 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,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 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.
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