![]() |
[asm] Übergabe eines Extended-Parameters
Hi!
Den Funktionsaufruf
Delphi-Quellcode:
wandelt Delphi in folgenden Assembler-Code um:
Sqrt(1000000);
Code:
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).
PUSH $00004012
PUSH $F4240000 PUSH $00 CALL Sqrt FSTP ST(0) 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? |
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. ![]() |
Re: [asm] Übergabe eines Extended-Parameters
Zitat:
Am Ende müsste gelten:
Code:
Welche der 96 gepushten Bits sind nun was?
1000000 = (-1)^v*2^(e-16383)*vm.nm
|
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 |
Re: [asm] Übergabe eines Extended-Parameters
Aaaaaaaaahhhhhhhhhhhhhhhhh :hello:
Zitat:
Danke!!! :thumb: :dp: |
Re: [asm] Übergabe eines Extended-Parameters
Zitat:
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... |
Re: [asm] Übergabe eines Extended-Parameters
Zitat:
Zitat:
|
Re: [asm] Übergabe eines Extended-Parameters
:wall: Ok, ich bin anscheinend etwas durch den WInd :cheers:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz