| Zeile 3: | Zeile 3: | ||
== Allgemeines == | == Allgemeines == | ||
=== Datengrößen === | === Datengrößen === | ||
| − | *Die Wortgröße des Prozessors zu verwenden ist meist | + | *Die Wortgröße des Prozessors zu verwenden ist meist vorteilhaft. (32 Bit bei i386, 64 Bit bei x86-64). |
=== Alignment === | === Alignment === | ||
| − | * Code und Daten sollten in getrennten [[ | + | * Code und Daten sollten in getrennten [[Paging|Pages]] gehalten werden. |
* Wenn man aber gezwungen ist, Code und Daten zu mischen, dann sollte man die Daten so legen, dass Sprünge nicht darüber hinweg springen müssen. | * Wenn man aber gezwungen ist, Code und Daten zu mischen, dann sollte man die Daten so legen, dass Sprünge nicht darüber hinweg springen müssen. | ||
* Selbst modifizierender Code widerspricht diesem Prinzip. | * Selbst modifizierender Code widerspricht diesem Prinzip. | ||
| Zeile 25: | Zeile 25: | ||
* Wenn in einer Schleife dieselbe Berechnung immer wieder ausgeführt wird, dann kann diese auch einmalig vor der Schleife berechnet werden. | * Wenn in einer Schleife dieselbe Berechnung immer wieder ausgeführt wird, dann kann diese auch einmalig vor der Schleife berechnet werden. | ||
Auch Funktionsaufrufe fallen unter Sprünge. | Auch Funktionsaufrufe fallen unter Sprünge. | ||
| − | * Funktionen, die nur wenig leisten, sollten vermieden und ihr Code direkt eingearbeitet werden (diesem Zweck dient das inline-Schlüsselwort in C) | + | * Funktionen, die nur wenig leisten, sollten vermieden und ihr Code direkt eingearbeitet werden (diesem Zweck dient das inline-Schlüsselwort in C, allerdings werden kurze Funktionen bei entsprechender Optimierung vom C-Compiler oft auch automatisch entsprechend behandelt) |
=== Caching === | === Caching === | ||
| Zeile 35: | Zeile 35: | ||
== Assembler == | == Assembler == | ||
=== Reduzierung der Codegröße === | === Reduzierung der Codegröße === | ||
| − | Die nachfolgenden Tricks eignen sich besonders zum Programmieren in [[Assembler]], wie es z.B. im [[Bootloader]] nötig ist. | + | Die nachfolgenden Tricks eignen sich besonders zum Programmieren in [[Assembler]], wie es z. B. im [[Bootloader]] nötig ist. |
{| {{prettytable}} | {| {{prettytable}} | ||
| Zeile 45: | Zeile 45: | ||
|- | |- | ||
|Prüfen, ob Register 0 ist | |Prüfen, ob Register 0 ist | ||
| − | |<asm>test eax, eax | + | |<asm>test eax, eax |
| + | jz ...</asm> | ||
|- | |- | ||
|Multiplikation mit einer Zweierpotenz | |Multiplikation mit einer Zweierpotenz | ||
| Zeile 70: | Zeile 71: | ||
|Addition, Subtraktion | |Addition, Subtraktion | ||
|<asm>lea eax, [ebx + ecx + 4]</asm> | |<asm>lea eax, [ebx + ecx + 4]</asm> | ||
| + | |- | ||
| + | |Bestimmte Multiplikationen (z. B. mit 3 oder 5) | ||
| + | |<asm>lea eax, [edx * 4 + edx]</asm> | ||
|} | |} | ||
=== Steigerung der Effektivität === | === Steigerung der Effektivität === | ||
| − | * Registerzugriffe sind immer schneller als | + | * Registerzugriffe sind immer schneller als Arbeitsspeicherzugriffe. |
* Daher sollten Parameter an Funktionen über Register, nicht über den Stack übergeben werden. | * Daher sollten Parameter an Funktionen über Register, nicht über den Stack übergeben werden. | ||
==== PUSHA / POPA ==== | ==== PUSHA / POPA ==== | ||
| − | * | + | * Von der Verwendung von pusha/popa ist meist abzuraten, da man auch jedes einzelne Register direkt pushen/popen kann, und dabei selektiver vorgehen kann. |
== Hochsprachen == | == Hochsprachen == | ||