Assembler: Extern sprintf
lima-city → Forum → Programmiersprachen → Sonstige Programmiersprachen
aufruf
bit
code
darstellung
double
fehler
folgende konfiguration
funktionieren
http
konvertierung
kopf
referenz
register
rest
rufen
speichern
stapel
url
zahl
zeichenkette
-
Unter Linux x86 versuche ich auf Assemblerebene die Cpp-Funktion sprintf aufuzurufen. Es herrscht unmittelbar vor dem Aufruf folgende Konfiguration vor:
Auf dem Stapel liegt:EAX = 0x3f800000 EBX = 0x00000001 ECX = 0x08049624 EDX = 0x00000001 EBP = 0xbf8b08d4 ESI = 0xbf8b08fc EDI = 0x08049624 EIP = 0x08048491 EFLAGS = 0x00000292 CS = 0x0073 DS = 0x007b ES = 0x007b FS = 0x0000 GS = 0x0033 SS = 0x007b
Im Speicher liegt unter 0x08049608 "%E" und unter 0x08049624 "\n,854442E-270" (Das ist Rest einer vorherigen Ausführung von sprintf). Genauer:[...] 0xbf8b08d4: 0x08049624 0xbf8b08d8: 0x08049608 0xbf8b08dc: 0x3f800000 [...]
Ich rufe nun sprintf auf, ohne etwas zu verändern:[...] 0x08049608: 25 45 00 00 01 00 00 00 00 00 00 00 00 00 00 00 (hex) 0x08049618: 00 00 00 00 00 00 00 00 00 00 00 00 0a 2c 38 35 (hex) 0x08049628: 34 34 34 32 45 2d 32 37 30 00 00 00 00 00 00 00 (hex) [...]
call sprintf
Unmittelbar nach dem Aufruf ist nun unter den Registern:
Das heißt, nur EAX, ECX, EDX und EIP haben sich geändert. Auf dem Stapel findet man:EAX = 0x0000000d EBX = 0x00000001 ECX = 0xbf8b07f4 EDX = 0x00000000 EBP = 0xbf8b08d4 ESI = 0xbf8b08fc EDI = 0x08049624 EIP = 0x08048496 EFLAGS = 0x00000292 CS = 0x0073 DS = 0x007b ES = 0x007b FS = 0x0000 GS = 0x0033 SS = 0x007b
Also unverändert, aber im Speicher ist nun:[...] 0xbf8b08d4: 0x08049624 0xbf8b08d8: 0x08049608 0xbf8b08dc: 0x3f800000 [...]
Also an Adresse 0x08049624 die Zeichenkette "4,854442E-270". Erwartet hätte man anhand der Referenz von sprintf allerdings die Zeichenkette "1,000000E+0". Allgemeiner eine Darstellung der Gleitkommazahl 1,0 (0x3f800000).[...] 0x08049608: 25 45 00 00 01 00 00 00 00 00 00 00 00 00 00 00 (hex) 0x08049618: 00 00 00 00 00 00 00 00 00 00 00 00 34 2c 38 35 (hex) 0x08049628: 34 34 34 32 45 2d 32 37 30 00 00 00 00 00 00 00 (hex) [...]
Ich zerbreche mir schon geraume Zeit den Kopf, was stimmt hier nicht? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo toolz,
Du musst die Gleitkommazahl als double, d.h. 64-Bit / 8-Byte Zahl, übergeben. Dann sollte es funktionieren. -
Danke sehr, das war der Fehler.
Nach einer etwas aufwändigeren Konvertierung von 32 Bit nach 64 Bit wird die Zahl endlich richtig in eine Zeichenkette konvertiert. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage