AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [asm] Übergabe eines Extended-Parameters

[asm] Übergabe eines Extended-Parameters

Ein Thema von Cöster · begonnen am 3. Feb 2007 · letzter Beitrag vom 3. Feb 2007
Antwort Antwort
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#1

[asm] Übergabe eines Extended-Parameters

  Alt 3. Feb 2007, 09:32
Hi!

Den Funktionsaufruf 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?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: [asm] Übergabe eines Extended-Parameters

  Alt 3. Feb 2007, 10:09
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

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
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: [asm] Übergabe eines Extended-Parameters

  Alt 3. Feb 2007, 11:14
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?
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: [asm] Übergabe eines Extended-Parameters

  Alt 3. Feb 2007, 11:44
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
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
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: [asm] Übergabe eines Extended-Parameters

  Alt 3. Feb 2007, 12:05
Aaaaaaaaahhhhhhhhhhhhhhhhh

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!!!
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: [asm] Übergabe eines Extended-Parameters

  Alt 3. Feb 2007, 12:43
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.

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...
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: [asm] Übergabe eines Extended-Parameters

  Alt 3. Feb 2007, 12:57
Zitat von sirius:
16402-16383 < 0
Sicher?

Zitat von sirius:
Muss ja auch Minus sein. ansonsen wwürden wir ja zahlenmäßig beim Vermögen von Bill Gates rauskommen.
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.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: [asm] Übergabe eines Extended-Parameters

  Alt 3. Feb 2007, 18:27
Ok, ich bin anscheinend etwas durch den WInd
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:33 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