Delphi macht etwa das daraus
Delphi-Quellcode:
00461AF3 EB1F jmp @@Loop
@@Start:
// Unit1.pas.32: Zahl:= Zahl +1/n;
00461AF5 D905381B4600 fld 1
00461AFB DC3424 fdiv &n
00461AFE DC442408 fadd &Zahl
00461B02 DD5C2408 fstp &Zahl
00461B06 9B wait
// Unit1.pas.33: n:= n+1;
00461B07 DD0424 fld &n
00461B0A D805381B4600 fadd 1
00461B10 DD1C24 fstp &n
00461B13 9B wait
@@Loop:
// Unit1.pas.30: while Zahl < i do
00461B18 DB442410 fild &i
00461B1C DC5C2408 fcomp &Zahl
00461B20 9B wait
00461B21 DFE0 fstsw ax
00461B23 9E sahf
00461B24 77CF jnbe @@Start
Eine Optimierung, welche mir einfällt ... kann man das
n denn nicht auch als Integer auslegen?
Delphi-Quellcode:
// Unit1.pas.33: n:= n+1;
00461B07 DD0424 fld &n
00461B0A D805381B4600 fadd 1
00461B10 DD1C24 fstp &n
00461B13 9B wait
Hier würde ja alles in einen winzigen Befehl (INC &i) reinpassen und das dan auch noch sofort und ohne warten auf die FPU.
Mit der
ASM-Programmierung der Fließkommaeinheit kenn ich mich nicht grade aus, aber vielleicht kann man da ja die Zahl gleich da drinne lassen und nicht immer rein- und wieder rauskopieren.
Wenn man das
n als Integer hätte, dann würde in der FPU ja nur vorranging mit Zahl gerechnet, wärend
n, zusammen mit
i womöglich sogar nur in den Registern rumgammeln könnte.
PS: wir hatten hier schon ein paar Mal, daß die hochoptimierten (Versuche von Menschen)
ASM-Codes wesentlich langsamer oder wenigstens/zumindestens genauso schnell waren, wie die optimierten Delphi-Codes aus 'nem Pascal-Compiler.