Speicher ausrichten



  • Hi Leute

    Habe ich das richtig verstanden, ich muss bei einer Asm x64-Funktion nur darauf schauen, dass der Stackpointer auf 16 ausgerichtet ist? Wenn ich eine Funktion aufrufe von meiner asm - Funktion aus mit z.B. 4 Argumenten dann reicht es 32 Byte zu reservieren vorausgesetzt der Stackpointer ist auf 16 ausgerichtet. Ich brauche keinen zusätzlichen Dummy-Platz zu reservieren? Muss ausser Stack pointer noch etwas auf 16 Byte ausgerichtet sein?



  • Mein Instinkt sagr mir, dass Du es nicht ganz richtig verstanden hast.

    1. Unterscheide ganz strikt zwischen Windows und Linux! Wenn Du Dir nicht ganz sicher bist, ob eine Information im Netz auf dein Betriebssystem ausgerichtet ist, dann vergiss sie ganz schnell wieder. Wenn Du eine Frage stellst, dann gib immer genau das Betriebssystem an (z.B. "Win7 64-bit")

    2. Unterscheide ganz strikt zwischen 64-bit und 32-bit. Auch hier sind die Unterschiede gewaltig. Es ist möglich, dass Du auf einem 64-bit-System ein 32-bit-Programm erstellst und laufen lässt. Wenn Du eine Frage stellst, dann gib immer genau die Zielgröße an (z.B. "64-bit Programm").

    3. Der Stack-Pointer muss genau vor dem Call auf 16 ausgerichtet sein. In der Funktion kommt er dann wegen der gestackten Rücksprungadresse nicht mehr ausgerichtet an, aber das weiß die Funktion.

    4. Wenn Du eine eigene Funktion aufrufst, dann kannst Du es machen, wie Du willst. Die Ausrichtung ist nur eine "calling convention", also eine Empfehlung.

    5. Bei einem 64-bit-Programm werden die Argumente in Registern übergeben (bei Windows andere Register als bei Linux!). Windows verlangt darüber hinaus noch sogenannten "shadow space", also rerservierten Stackspeicher von 32 Byte direkt über der Rücksprungadresse. Dieser shadow space ist irgendwie übrig geblieben bei der Umstellung von stack- auf registerorientierte Übergabe und wird meistens nicht genutzt - er wird aber wichtig bei mehr als 4 Argumenten, weil das fünfte und jedes weitere Argument hinter dem shadow space auf dem Stack landet.

    6. Die Ausrichtung ist nicht sooo wichtig. Wenn Du Anfänger bist, dann solltest Du sie erst anfangen zu beachten, wenn Dein Programm abstürzt. Bringe erst mal Visual Studio anständig zum Laufen, das ist schwer genug.

    viele grüße
    ralph


Anmelden zum Antworten