TI2-Tutorium, 24.04.2013

Orga-Krams

Vorlesung

Zahlensysteme

  • 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

Stellenwerte

  • Eine Zahl ist wie folgt aufgebaut:

    znzn − 1 … z1z0 ,  z−1z−2 … zm

  • Beispiele: 5346, 35310 aber auch 10110, 0112 oder DF, A716

  • Jede Ziffer zi hat einen Stellenwert bi, wenn b die Basis ist

    • Der Wert der Ziffer zi ist also zi ⋅ bi
  • Gesamt: W = zn ⋅ bn + … + z1 ⋅ b1 + z0 ⋅ b0 + z1 − 1 ⋅ b−1 + … + zm ⋅ bm

Umwandlung in das Dezimalsystem

  • Wie vorher schon gesagt einfach Stellenwerte addieren

Beispiel

  • Zahl: 101101, 1012
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
  • Ergebnis: 32 + 8 + 4 + 1 + 0, 5 + 0, 125 = 45, 62510

Umwandlung vom Dezimalsystem

  • Prinzip: Division mit Rest durch die Basis

Euklid

  • Folie 2.10

Horner

  • Folie 2.11 - 2.14

Assembler – Wiederholung

Register

  • Wir haben 15 Register

    • schnelles Rechnen

    • Übergabe von Parametern

    • Rückgabe von Funktionswerten

Assembler-Operationen

  • Aufbau: operation operand_1, operand_2

  • Manchmal nur ein Operand, manchmal auch keiner

  • operand_x kann je nach operation verschiedenes sein:

    • Register (rax, rbx, …)
    • Konstanter Wert (234, 45, …)
    • Sprungmarke (im Data-Bereich)
    • Speicherstelle ([rax+8]; kommen wir in einem späteren Tutorium noch zu)

Kopiere Wert

Syntax

mov zieloperand, quelloperand

Semantik

zieloperand = quelloperand

Beispiel

1
2
mov rdi, 42  ; rdi = 42
mov rbx, rdi ; rbx = rdi

Inkrement

Syntax

inc zieloperand

Semantik

zieloperand = zieloperand + 1

Beispiel

1
2
3
; rax = 45 + 1
mov rax, 45
inc rax

Dekrement

Syntax

dec zieloperand

Semantik

zieloperand = zieloperand - 1

Beispiel

1
2
3
; rax = 45 - 1
mov rax, 45
dec rax

Addition

Syntax

add zieloperand, quelloperand

Semantik

zieloperand = zieloperand + quelloperand

Beispiel

1
2
3
; rdx = 45 + 32
mov rdx, 45
add rdx, 32

Subtraktion

Syntax

sub zieloperand, quelloperand

Semantik

zieloperand = zieloperand - quelloperand

Beispiel

1
2
3
; rcx = 45 - 32
mov rcx, 45
add rcx, 32

Assembler – Neues

Multiplikation

Syntax

mul quelloperand

Semantik

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.

Beispiel

1
2
3
; rdx:rax = 47 * 23
mov rax, 47
mul 23

Division

Syntax

div quelloperand

Semantik

rax = rdx:rax // quelloperand (ganzzahlige Division) rdx = rdx:rax % quelloperand (Modulo)

Beispiel

1
2
3
4
5
; rax = 47 // 12 = 3
; rdx = 47 % 12 = 11
mov rdx, 0
mov rax, 47
div 12

Programmsteuerung

Bisher

  • Langweilige Programme

    • Keinerlei Bedingungen, Schleifen, etc.
  • Schön wäre so etwas wie

    if <Bedingung> then
        <Code>
    else
        <Code>

    oder

    while <Bedingung>
        <Code>
    end
  • Geht leider nicht so einfach

Sprung

  • Wir können innerhalb unseres Programms springen:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    func:
        jmp marke2
    marke1:
        mov rax, rbx
        jmp marke3
    marke2:
        mov rbx, 20
        jmp marke1
    marke3:
        ret
  • jmp marke bedeutet: Setze das Programm in der Zeile mit marke: fort.

  • Leider wird immer gesprungen.

Vergleichen

  • Wir wollen nur bei bestimmten Bedingungen springen.

  • Bedingung bedeutet meistens: Wir wollen zwei Werte miteinander vergleichen.

Syntax

cmp operand_1, operand_2

Semantik

Rechne operand_1 - operand_2 und setze Statusregister.

Statusregister

  • Zusätzlich zu den Registern, mit denen wir rechnen hat die CPU noch sogenannte Statusregister.
  • Speichern zusätzliche Informationen zum Ergebnis
    • z.B.: ZF wird auf 1 gesetzt, wenn das Ergebnis einer Operation 0 ist

Bedingter Sprung

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

Beispiele

  • je marke springt zu marke wenn die verglichenen Operanden gleich sind (jump if equal).

  • jne marke springt zu marke wenn die verglichenen Operanden nicht gleich sind (jump if not equal).

  • Weitere sind zu finden im Handbuch (AMD: Seite 215; Intel: Seite 166)

Bedingter Sprung (weiter)

Fakultät berechnen

1
2
3
4
5
6
7
8
9
10
11
12
13
14
fac: ; Am Ende soll rax = rdi! sein
    mov rax, rdi

loop:
    dec rdi

    cmp rdi, 0 ; if rdi == 0 then goto end
    je end

    mul rdi
    jmp loop

end:
    ret