Ü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:
| 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 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,r8oder 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.
Aufgabe
Schreiben Sie drei Zeilen Assembly, um die Werte zwischen r8 und r9 zu vertauschen.
Anfangswerte (bereitgestellt durch die Testumgebung):
r8beginnt mit 6r9beginnt mit 2
Nach Ihrem Code:
r8sollte 2 seinr9sollte 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
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