developers-forum.de

Normale Version: [SDL] Problem mit Parameterübergabe
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
N23 Tutorial zu SDL und ASM ist spitze. Beim Selbstprobieren bin ich auf ein Problem gestoßen, dass ich lösen konnte, aber mir nicht erklären kann.

Die Funktion SDL_MapRGB (const SDL_Pixelformat * const format, const Uint8 r, const Uint8 g, const Uint8 b) würde ich intiutiv wie folgt aufrufen:

C-Aufruf:
Code C :
SDL_Surface *screen = SDL_SetVideoMode (...);
[....]
SDL_MapRGB (screen->format, 255, 0, 0);


NASM:
Code ASM :
screen DW 0
[...]
call SDL_SetVideoMode
[...] ; Fehlerabfang
mov [screen], eax
[...]
push DWORD 0
push DWORD 0
push DWORD 255
push [screen+4]
call SDL_MapRGB


Doch beim Ausführen kommt es zum Absturz des Programms, es funktioniert mit 'push screen+4'. Mit diesen Befehl habe ich aber meine Probleme. 'push screen' bedeutet, dass die Speicheradresse von screen auf den Stack gelegt wird, nicht die Adresse, auf die er referenziert, dies müsste nämlich 'push [screen]' heißen. 'push screen+4' müsste mich danach nicht zu screen->format bringen, sondern auf das DoubleWord nach screen.

Irgendwie bin ich ganz durcheinander, vorallem da format selbst ein Pointer ist. Könnte mir bitte jemand weiterhelfen? Google spuckte kein klärendes Ergebnis aus.
Hallo,

mit dem folgenden Code sollte es funktionieren:

Code ASM :
mov eax, [screen]
push DWORD 0
push DWORD 0
push DWORD 255
push [eax+4]
call SDL_MapRGB


Wie du richtig schreibst, würde push [screen] die Adresse des SDL_Surface auf dem Stack ablegen. Der obige Code lädt diese Adresse zuuerst in eax und legt dann den Inhalt an der Adresse eax+4 auf dem Stack ab. (Am Offset 4 liegt die Variable screen->format - Definition von SDL_Surface)

Das push screen+4 funktioniert hat war nur Zufall, wahrscheinlich hat das zufällig halbwegs sinnvolle Werte für format ergeben.

N43
Danke, hat wunderbar funktioniert.
Referenz-URLs