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>
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  |  |