Eine kleine Frage zum Stack



  • Hallo zusammen
    Wir sind gerade dabei das Backend eines Compilers zu schreiben, der Jasmin (Java Bytecode) in 32-Bit Intel Assembler übersetzt. Nun habe ich eine kleine Unsicherheit in Bezug auf das Layout des Stacks:

    geht es so?

    ...
    prm[n-2]
    prm[n-1]
    ret
    ebp
    eax,
    ebx,
    ecx,
    usw...
    var1
    var2
    ...

    oder so?

    ...
    prm[n-2]
    prm[n-1]
    ret
    eax,
    ebx,
    ecx,
    usw...
    ebp
    var1
    var2
    ...

    Es spielt meiner Meinung nach nicht wirklich eine Rolle! Bei der ersten Variante muss ich die Indices von sämtlichen Parametern neu berechnen, falls ich plötzlich ein Register mehr oder weniger sichern muss, bei der zweiten Variante dafür die Indices von sämtlichen lokalen Variablen. Die Frage ist nur, was machen herkömmliche Compiler?

    Au ja, noch eine Frage:
    Bei 16-Bit Assembler ist es ja nicht erlaubt, 1 Bytes auf den Stack zu legen, sondern es muss immer ein Vielfaches von 2 sein:

    sub esp,2

    Muss das unter 32-Bit Assembler zwingend ein Vielfaches von 4 sein?
    Lg Ishildur



  • Interessantes Projekt. 🙂
    Zu deiner 1. Frage kann ich leider nicht viel sagen... Wahrscheinlich mal so, mal so - wie du schon sagst, duerfte das ja so den Unterschied nicht machen.
    Je nachdem, wie komplex oder professionell euer Compiler ist, waere evtl. auch eine Option, immer bestimmte Register (anbieten wuerden sich zB. ebp, ebx, ecx, esi und edi) zu sichern, den Block somit konstant zu halten und edx und eax generell als return, bzw. undeiniert anzunehmen...

    Zur 2.:
    1Byte ist generell nicht "erlaubt". Das kleinste, was du auf den Stack packen kannst, sind 16bit. Das ist unabhaengig von 16 oder 32Bit-Assembler.
    Es muss also bei 32Bit nicht zwingend ein Vielfaches von 4 sein, ich wuerde aber dringend empfehlen, den Stack immer dword-aligned zu halten. Nicht nur aus Performancegruenden, sondern auch weil zB. Windows gern mal komische Anfaelle bekommt, wenn du WinAPI-Funktionen mit einem nicht dword-ausgerichteten Stack aufrufst.


Anmelden zum Antworten