====== ASM ====== ===== Aufbau einer CPU ==== [[http://www.pagetable.com/?p=517|Lecture recordings]] \\ [[http://events.ccc.de/congress/2010/Fahrplan/events/4159.en.html|Fahrplan zum Vortrag]] \\ [[http://visual6502.org/wiki/index.php?title=Hanson%27s_Block_Diagram|Blockplan]] \\ [[http://visual6502.org/JSSim/index.html|CPU Simulator]] \\ [[http://visual6502.org/wiki/index.php?title=Main_Page#6502_additional_information|A list of awesome high res pictures]] [[http://www.4004.com/|Intel 4004 Project]] ===== 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 - Register v. Hauptprozessor - Register des Koprozessors - 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 ==== - Caller saved sichern (''t*'') - Argumente pushen - ''jal'' ==== Callee Prolog ==== - ''sp'' setzen - Callee saved sichern (''fp'', ''ra'', ''s*'') - ''fp'' setzen ==== Callee Epilog ==== - Callee saved wiederherstellen (''s*'', ''ra'', ''fp'') - ''sp'' rücksetzen - ''jr $ra'' ==== Caler Epilog ==== - Caler saver wiederherstellen (''t*'') ===== Call conventions ===== Sowas wird ABI genant. * unbekanter compiler, von SPIM: http://www.scribd.com/doc/2576047/SPIM * unbekanter compiler, von SPIM: http://pages.cs.wisc.edu/~larus/SPIM/spim_documentation.pdf * unbekannter compiler, Irgendeine Uni, (erkennbar an push/pop beispielen): http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/stack.html * unbekanter compiler, irgendeine Uni, erste Seite: https://docs.google.com/viewer?a=v&q=cache:iKSXyaucDJsJ:www.cs.uiuc.edu/class/fa06/cs232/lectures/L4.ppt+mips+stack+pointer+free+address&hl=de&gl=de&pid=bl&srcid=ADGEESin4FiJ9Oop0J_NR6_MJ0NML9F3IkK_dGF8uW-Lev0GZGK2d8v1hcX_6GL3V9skSbgqIkkeJDkbAyIyx5ECpPk39BIoh7yGuSjAJKKD5DotjTDbp8XfSLiGt_6hx9n2R5qHJYXF&sig=AHIEtbT6FSbP1NdhOxntkavy8rvLDf0IsA * System V compiler, ABI von SCO: http://math-atlas.sourceforge.net/devel/assembly/mipsabi32.pdf * GCC: http://oopweb.com/Assembly/Documents/SPIM/Volume/Calling%20Convention.htm * Übersicht über MIPS ABIs: http://stackoverflow.com/questions/811424/gcc-mips-32-calling-conventions-stack-frame-definition