kostenloser Webspace werbefrei: lima-city


Assembler: Extern sprintf

lima-cityForumProgrammiersprachenSonstige Programmiersprachen

  1. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    Unter Linux x86 versuche ich auf Assemblerebene die Cpp-Funktion sprintf aufuzurufen. Es herrscht unmittelbar vor dem Aufruf folgende Konfiguration vor:
    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
    Auf dem Stapel liegt:
    [...]
    0xbf8b08d4:  0x08049624
    0xbf8b08d8:  0x08049608
    0xbf8b08dc:  0x3f800000
    [...]
    Im Speicher liegt unter 0x08049608 "%E" und unter 0x08049624 "\n,854442E-270" (Das ist Rest einer vorherigen Ausführung von sprintf). Genauer:
    [...]
    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)
    [...]
    Ich rufe nun sprintf auf, ohne etwas zu verändern:
    call sprintf

    Unmittelbar nach dem Aufruf ist nun unter den Registern:
    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
    Das heißt, nur EAX, ECX, EDX und EIP haben sich geändert. Auf dem Stapel findet man:
    [...]
    0xbf8b08d4:  0x08049624
    0xbf8b08d8:  0x08049608
    0xbf8b08dc:  0x3f800000
    [...]
    Also unverändert, aber im Speicher ist nun:
    [...]
    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)
    [...]
    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).

    Ich zerbreche mir schon geraume Zeit den Kopf, was stimmt hier nicht?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo toolz,

    Du musst die Gleitkommazahl als double, d.h. 64-Bit / 8-Byte Zahl, übergeben. Dann sollte es funktionieren.
  4. Autor dieses Themas

    toolz

    Kostenloser Webspace von toolz

    toolz hat kostenlosen Webspace.

    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.
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!