Autor Beitrag
SyntaxError
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 30



BeitragVerfasst: Sa 10.02.07 15:33 
user profile iconBenBE hat folgendes geschrieben:
Zum Thema Division nur soviel ...
Man shiftet so lang nach links, bis in einem zweiten Register ein Wert steht, der größer ist, als die Zahl, durch die geteilt werden soll. Ist das der Fall, wird mit 2 multipliziert und 1 addiert. Ist das nicht der Fall, wird das Ergebnis nur mit 2 multipliziert ...
So hat man 32 Durchläufe (Registerbreite) und nahezu 0 Zusatzspeicher benötigt ... Ich hab das mit der Division mal für Int32/Int32 auf Z80 (8-Bit)-Assembler gesehen ... Eine Routine 1,5 Bildschirmseiten, aber es ging ... Was die CPU nicht kann, wird wenn's benötigt wird mit Software nachgebaut ... Und alles, was in Software realisierbar ist, kann man auch einer Hardware beibringen ...


Bliebe noch anzumerken, daß eine Multiplikation mit 2 nix anderes ist als eine Addition mit sich selbst .... ;):D

_________________
Gruß SyntaxError
SyntaxError
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 30



BeitragVerfasst: Sa 10.02.07 15:50 
Im Prinzip isses doch ganz einfach:

5*5 = 25

Das wissen wir als Mensch, weil wir es auswendig kennen. Wissen wir es nicht, amchen wir folgendes:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
5+ ( 5)
5+ (10)
5+ (15)
5+ (20)
5  (25)
====
25



Nix anderes macht eine CPU auf unterster Ebene in Binär:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
0000 0101+ (0000 0101)
0000 0101+ (0000 1010)
0000 0101+ (0000 1111)
0000 0101+ (0001 0100)
0000 0101  (0001 1001)
==========
0001 1001

_________________
Gruß SyntaxError
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 10.02.07 15:58 
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:
ausblenden 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:
ausblenden 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:
ausblenden 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:
ausblenden 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:
ausblenden 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:
ausblenden 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.