Du wirst's kaum glauben, aber viele ältere Programme nutzen genau das aus: Die CPU kann schneller addieren als Multiplizieren ... Wie multipliziert man also mit 10?
Richtig:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| asm MOV EDX, EAX ADD EAX, EAX ADD EAX, EAX ADD EAX, EDX ADD EAX, EAX end; |
Womit wir auch EAX mit 10 multipliziert hätten (auf 286ern und auch Z80 geht sowas wirklich schneller UND einfacher ...).
Das ist übrigens nix anderes, als ich in meinem vorigen ASM-Beispiel für die Adressierung genutzt hab ...
Mit etwas Kreativität oder einem guten Compiler schreibt man unter 486er aufwärts nur das hier:
Delphi-Quelltext
1: 2: 3: 4:
| asm LEA EAX, [EAX+4*EAX] ADD EAX, EAX end; |
Interessant daran: Da die Adress-Einheit der CPU meist eh ungenutzt ist, brauch diese Befehlsfolge genau einen zusätzlichen Taktzyklus. Möchte man nun mit 1000 Multiplizieren sollte man jedoch das hier vermeiden:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| asm LEA EAX, [EAX+4*EAX] ADD EAX, EAX LEA EAX, [EAX+4*EAX] ADD EAX, EAX LEA EAX, [EAX+4*EAX] ADD EAX, EAX end; |
Es geht zwar, brauch aber mindestens 6 Taktzyklen, weil alle Befehle direkt voneinander abhängig sind ... Außerdem ist's so schneller:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| asm LEA EAX, [EAX+4*EAX] LEA EAX, [EAX+4*EAX] LEA EAX, [EAX+4*EAX] LEA EAX, [8*EAX] end; |
(Wer's nicht glaubt: 4 Taktzyklen

) Hat man neben dieser Multiplikation mit 1000 noch andere Dinge zu tun, kann man diese nun effektiv mit einstreuen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| asm MOV EAX, 1 LEA EAX, [EAX+4*EAX] XOR EDX, EDX LEA EAX, [EAX+4*EAX] MOV DX, 300 LEA EAX, [EAX+4*EAX] ADD DL, '7' LEA EAX, [8*EAX] ADD EAX, EDX end; |
Wer's nicht glaubt: 5 Taktzyklen und ihr habt in EAX das Ergebnis einer umfangreichen BErechnung ... Wobei für dien Fall die optimalste Version wahrscheinlich das hier ist UND bleibt:
Delphi-Quelltext
1: 2: 3:
| asm MOV EAX, 1337 end; |
(von der zusätzlichen Nebeneffektfreiheit mal abgesehen)
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.