Es gibt verschiedene Zahlensysteme mit verschiedener Basis (Anzahl der Zeichen)
Dezimal (Basis 10) für uns Menschen
Binär (Basis 2) für den Computer
Hexadezimal (Basis 16) (und Oktal (Basis 8)) für Mensch ↔ Computer
Eine Zahl ist wie folgt aufgebaut:
zn zn − 1 … z1 z0 , z−1 z−2 … z−m
Beispiele: 5346, 35310 aber auch 10110, 0112 oder DF, A716
Jede Ziffer zi hat einen Stellenwert bi, wenn b die Basis ist
Gesamt: W = zn ⋅ bn + … + z1 ⋅ b1 + z0 ⋅ b0 + z1 − 1 ⋅ b−1 + … + z−m ⋅ b−m
Stellenwert | 32 | 16 | 8 | 4 | 2 | 1 | 0,5 | 0,25 | 0,125 |
---|---|---|---|---|---|---|---|---|---|
Ziffer | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 |
Wert | 32 | 0 | 8 | 4 | 0 | 1 | 0,5 | 0 | 0,125 |
Wir haben 15 Register
schnelles Rechnen
Übergabe von Parametern
Rückgabe von Funktionswerten
Aufbau: operation operand_1, operand_2
Manchmal nur ein Operand, manchmal auch keiner
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 |
|
mul quelloperand
rdx:rax = rax * quelloperand
rdx
und rax
werden quasi nebeneinander geschrieben als eine Zahl interpretiert. In den meisten Fällen (kleine Zahlen) ist rdx=0
.
1 2 3 |
|
div quelloperand
rax = rdx:rax // quelloperand
(ganzzahlige Division) rdx = rdx:rax % quelloperand
(Modulo)
1 2 3 4 5 |
|
Langweilige Programme
Schön wäre so etwas wie
if <Bedingung> then
<Code>
else
<Code>
oder
while <Bedingung>
<Code>
end
Geht 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 |
|