Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [asm] Übergabe eines Extended-Parameters (https://www.delphipraxis.net/85683-%5Basm%5D-uebergabe-eines-extended-parameters.html)

Cöster 3. Feb 2007 08:32


[asm] Übergabe eines Extended-Parameters
 
Hi!

Den Funktionsaufruf
Delphi-Quellcode:
Sqrt(1000000);
wandelt Delphi in folgenden Assembler-Code um:

Code:
PUSH $00004012
PUSH $F4240000
PUSH $00
CALL Sqrt
FSTP ST(0)
Durch die drei Pushes wird wahrscheinlich die 1000000 auf dem Stack abgelegt. 1000000 ist hexadezimal dargestellt allerdings nur $F4240. Der Rest wird wahrscheinlich zusätzlich gepusht, weil Sqrt einen 10 Byte großen Extended-Parameter erwartet. Hier werden aber insgesamt 12 Bytes gepusht (da bei der dritten Zeile ja eig. $00000000 gepusht wird).
Welche Zahl wird in der Funktion Sqrt als Parameter vom Stack genommen wird? $4012F42400000000? Wie kommt man davon dann auf 1000000?

Kurz: Kann mir jemand die drei Pushes erklären?

sirius 3. Feb 2007 09:09

Re: [asm] Übergabe eines Extended-Parameters
 
Das PUSH geht nunmal bei einer 32bit-CPU nur in 32bit-Schritten. Demnach kannst du nur in n*4Bytes deine Zahl abspeichern. Da du 10Bytes benötigts, tut der Compiler halt 12 Bytes pushen. die nächst kleiner Variante (8Bytes) sind ja zu wenig. Ist halt ein bisschen Verschwendung. Alles andere würde aber nur zu Laufzeitverzögerungen führen. Übergib mal Boolean! Da brauchst du eigentlich nur 1Bit und nutzt 32 :wink:

Ansonsten schau dir mal Fließkommezahlen an! Extended besteht uas 80bit, davon ist das erste das Vorzeichen, die nächsten (ich glaube) 31 sind der Exponenent und der Rest ist die Mantisse.

Schau auch hier

Cöster 3. Feb 2007 10:14

Re: [asm] Übergabe eines Extended-Parameters
 
Zitat:

Zitat von sirius
Ansonsten schau dir mal Fließkommezahlen an! Extended besteht uas 80bit, davon ist das erste das Vorzeichen, die nächsten (ich glaube) 31 sind der Exponenent und der Rest ist die Mantisse.

Laut Delphi-Hilfe: 1 Bit für Vorzeichen(v), 15 Bits für Exponent(e), 1 Bit für Vorkommazahl der Mantisse(vm), 63 Bits für Nachkommastellen der Mantisse(nm).
Am Ende müsste gelten:
Code:
1000000 = (-1)^v*2^(e-16383)*vm.nm
Welche der 96 gepushten Bits sind nun was?

sirius 3. Feb 2007 10:44

Re: [asm] Übergabe eines Extended-Parameters
 
Vermutung:
$00004012 <-- hier werden die ersten 2 Bytes nicht benutzt (wie brauchen ja nur 10 Bytes)

Dann haben wir ($4012): 0100 0000 0001 0010 b
Das erste bit (0) ist das Vorzeichen -->Plus
Der Rest ist der Exponent.
Und dann steht da 16402, davon wird 2^14=16384 abgezogen -> -18 ist der Exponent

Die Mantisse binär ($F424000000...):
1111 0100 0010 0100 0000 0000 ....
Das Komma steht (wahrscheinlich hinter dem ersten bit):
1,111 0100 0010 0100 0000 0000
Das jetzt mal 2^-18 (also 18 stellen nacht rechts)
111101000010010000
Neu sortieren:
0111 1010 0001 0010 0000
:gruebel: Hm, da feht eine stelle, wir hätten mit 2^-19 multiplizieren müssen


Ergebnis wäre:
1Mill =
1111 0100 0010 0100 0000


Edit: Es heißt 16384

Cöster 3. Feb 2007 11:05

Re: [asm] Übergabe eines Extended-Parameters
 
Aaaaaaaaahhhhhhhhhhhhhhhhh :hello:

Zitat:

Zitat von sirius
Und dann steht da 16402, davon wird 2^14=16384 abgezogen -> -18 ist der Exponent

Davon wird nicht 2^14, sondern 2^14-1=16383 abgezogen (siehe Delphi-Hilfe). Der Exponent ist also 19 (wo kommt bei dir immer das Minus-Zeichen her?). Dann passt auch alles, wenn der Rest so ist, wie du sagst, und es kommt am Ende 1000000 raus.

Danke!!! :thumb: :dp:

sirius 3. Feb 2007 11:43

Re: [asm] Übergabe eines Extended-Parameters
 
Zitat:

(wo kommt bei dir immer das Minus-Zeichen her?)
Na 16402-16383 < 0. Daher das Minuszeichen.
Muss ja auch Minus sein. ansonsen wwürden wir ja zahlenmäßig beim Vermögen von Bill Gates rauskommen. :mrgreen:

PS und ich dachte mir, dass da im exponent wahrscheinlich noch eine 1 fehlt. Aber ich war mir nicht sicher. Mir ist auch noch irgendwie so, dass vor die Mantisse generell eine 1 geschrieben werden muss (und nicht eine 0, wie ich es gemacht habe), aber solange es klappt...

Cöster 3. Feb 2007 11:57

Re: [asm] Übergabe eines Extended-Parameters
 
Zitat:

Zitat von sirius
16402-16383 < 0

:shock: Sicher?

Zitat:

Zitat von sirius
Muss ja auch Minus sein. ansonsen wwürden wir ja zahlenmäßig beim Vermögen von Bill Gates rauskommen.

:wiejetzt: Es muss Plus sein, damit das Komma nach rechts verschoben wird und die Zahl größer wird. Wenn das Komma nach links verschoben würde, würde aus 1,11101... doch 0,0000000...11101 werden, was eindeutig kleiner als 1000000 ist.

sirius 3. Feb 2007 17:27

Re: [asm] Übergabe eines Extended-Parameters
 
:wall: Ok, ich bin anscheinend etwas durch den WInd :cheers:


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz