
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
(Beispiel aus der Vorlesungsfolie.)
rax, rbx, rcx, rdx, rsi, rdi, rbp, rsp, r8, r9, r10, r11, r12, r13, r14, r15Wir haben 16 Register
schnelles Rechnen
Übergabe von Parametern
Rückgabe von Funktionswerten
Siehe hierzu die AMD-Doku, Seite 39, PDF-Seite 75.
Aufbau: operation operand_1, operand_2
Manchmal nur ein Operand, manchmal auch keiner, sehr selten auch drei
operand_x kann je nach operation verschiedenes sein:
rax, rbx, …)234, 45, …)[rax+8]; kommen wir in einem späteren Tutorium noch zu)mov zieloperand, quelloperand
zieloperand = quelloperand
1 2 | |
inc zieloperand
zieloperand = zieloperand + 1
1 2 3 | |
dec zieloperand
zieloperand = zieloperand - 1
1 2 3 | |
add zieloperand, quelloperand
zieloperand = zieloperand + quelloperand
1 2 3 | |
sub zieloperand, quelloperand
zieloperand = zieloperand - quelloperand
1 2 3 | |
Langweilige Programme
Schön wäre so etwas wie
if <Bedingung> then
<Code>
else
<Code>
oder
while <Bedingung>
<Code>
endGeht leider nicht so einfach
Wir können innerhalb unseres Programms springen:
1 2 3 4 5 6 7 8 9 10 | |
jmp marke bedeutet: Setze das Programm in der Zeile mit marke: fort.
Leider wird immer gesprungen.
Wir wollen nur bei bestimmten Bedingungen springen.
Bedingung bedeutet meistens: Wir wollen zwei Werte miteinander vergleichen.
cmp operand_1, operand_2
Rechne operand_1 - operand_2 und setze Statusregister.
ZF wird auf 1 gesetzt, wenn das Ergebnis einer Operation 0 istEs gibt Sprungbefehle, die nur springen, wenn bestimmte Bedingungen wahr sind ⇒ bedingte Sprünge
Sie arbeiten auf Basis der Statusregister
Meist in Kombination mit einem davor ausgeführten CMP-Befehl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |