ASM

Aufbau einer CPU

Misc

Arithmetisch er Shift = Mit vorzeichen

Shift (*2): x = x+x , schiebt eine 0 von rechts rein

Framepointer um sich zu spaaren alles vom stack runter zu nehmen

Bis zum Framepointer vom caler
ab dem fraimpointer vom callee

jal = „jump and load“ … speichert die addresse des nächsten befehls in $ra

Mips hat 2 Coprozessoren

Interrupt = asynchron
exception = synchron

Adressierung

  • Direkte (Instruktion –> Gesuchte Daten)
  • Indirekte (Instruktion –> Pointer im RAM –> Gesuchte Daten)
  • Indizierte (Index Register + Index im RAM –> Gesuchte Daten)
  • Relative (SCR + Instruktion –> Gesuchte Daten)
  • (Immediate (Keine Adresse, sondern Daten in Instruktion))

Stack

Zeigt auf die nächste freie Adresse (ja normalerweise nicht, aber WTF).

Register

  • s0 – s7 Working registers (callee saved)
  • t0 – t9 Working registers (caller saved/temporary)
  • a0 – a3 Arguments
  • v0 – v1 Return value
  • k0 – k1 Kernel reserved
  • sp Stackpointer (nächste freie Adresse)
  • fp Frame Pointer
  • ra Return Adress
  • gp Global Pointer (for relative data adressing)
  • at Für Assembler
  • zero = 0

Endianes

Achtung, genau verdreht als Name vermuten lässt

Big Endian

Großes Ende ⇒ LSB am Ende

Nachteil: Verschieben der Bits wenn Zahl kleiner als Speicherzelle (z.B. Byte in Word speichern)

Little Endian

Kleines Ende ⇒ MSB am Ende

  • x86
Auffüllen Wenn Zahl Keiner Speicherplatz je nach Vorzeichen!

Umschaltbar

  • MIPS

SPIM

Assembler Sprache von MIPS

Direktiven

  • .word 32 Bit
  • .half 16 Bit
  • .byte 8 Bit
  • .ascii Text
  • .asciiz Text + \0
  • .space 42 (Freier platz für 42 Byte)
  • .text Code ab hier
  • .data Daten ab hier
''.word 1 2 3 0x42''
''.asciiz "Hallo Welt"''
''.word label1 label2 label3'' (Sprungtabelle)

Befehlaufbau

Zielregister zuerst
  1. Register v. Hauptprozessor
  2. Register des Koprozessors
  3. Adressen, Werte, Marken

Adressierungarten

[label] [+] [imm] [(register)]

  • (register)
  • imm
  • imm(register)
  • label + imm
  • label + imm(register)

Befehle

*u = Unsigned ⇒ Auffüllen mit 0
sonst ⇒ Auffüllen mit 0/1 je nach vorzeichen
z.B. lb und lbu

„with overflow“ erzeugt ggf. interrupt

syscall: Nummer in $v0

Unterprogrammaufrufe

Caller Prolog

  1. Caller saved sichern (t*)
  2. Argumente pushen
  3. jal

Callee Prolog

  1. sp setzen
  2. Callee saved sichern (fp, ra, s*)
  3. fp setzen

Callee Epilog

  1. Callee saved wiederherstellen (s*, ra, fp)
  2. sp rücksetzen
  3. jr $ra

Caler Epilog

  1. Caler saver wiederherstellen (t*)

Call conventions

users/skruppy/ext/uni/2/ra/asm.txt · Zuletzt geändert: 2012/07/19 02:41 von 88.66.198.26