Parameterübergabe will nicht so recht ...

15/04/2012 - 22:22 von Jens Kallup | Report spam
Hallo,

schaut Euch mal folgenden Code an:
ich habe Probleme mit der Parameter übergabe
für Tipps bin ich Euch dankbar.
Jens

...
fld qword [_LC11]
fistp dword [esp+8]

fld qword [_LC12]
fistp dword [esp+12]

fld qword [_LC13]
fistp dword [esp+16]


push 3
push dword _LCta
push dword array_myArray

call get_array_value

...

segment .data
_LCta: dq 0.04
_LC11: dq 1.00
_LC12: dq 2.00
_LC13: dq 3.00


// -

extern "C" void get_array_value(char *n, double *nptr, int num, ...)
{
int dim[12];

va_list ptr;
int s, m,k;
for (k = 0; k < 12; k++) dim[k] = 0;

cout << "--> " << n << endl;
cout << "->> " << *nptr << endl;

va_start(ptr,num);
for (m = num; m >= 1; m--)
{
k = va_arg(ptr,int);
dim[m] = k;
cout << k << " ";
}
va_end(ptr);

double v =
ArrayList[QString(n)][dim[0]][dim[1]][dim[2]][dim[3]][dim[4]][dim[5]][dim[6]][dim[7]][dim[8]][dim[9]][dim[10]][dim[11]].value().toDouble();
*nptr = v;
cout << *nptr << endl;
}


// result:
->> 0.04
0 0 1 0


// should be:
->> 0.04
1 2 3
 

Lesen sie die antworten

#1 Thomas Rachel
15/04/2012 - 23:04 | Warnen spam
Am 15.04.2012 22:22 schrieb Jens Kallup:
Hallo,

schaut Euch mal folgenden Code an:
ich habe Probleme mit der Parameter übergabe
für Tipps bin ich Euch dankbar.
Jens

...
fld qword [_LC11]
fistp dword [esp+8]

fld qword [_LC12]
fistp dword [esp+12]

fld qword [_LC13]
fistp dword [esp+16]



Mal davon ausgehend, daß auf dem Stack *nach unten hin* genug Platz ist,
Du also vorher add esp, 12 ausgeführt hast (sonst überschreibst Du Dir
lokale Variablen und/oder den Stackframe), dürften die Indices falsch sein.

Bezogen auf den esp-Wert zum Zeitpunkt unmittelbar vor dem call sollten
die Werte stimmen, aber bevor Du die drei pushes ausgeführt hast, hast
Du einen anderen esp-Wert als zuvor.

Gewünschter Layout des Stackbereiches vor dem call (relativer Index und
Inhalt):

0x00 array_myArray
0x04 &_LCta
0x08 3
0x0C 1
0x10 2
0x14 3

Dies würde zu einem Aufruf (array_myArray, &_LCta, 3, 1, 2, 3) führen.

Jetzt ist aber for dem ersten fld/fistp-Paar der Stack-Pointer bei 0x0C
(so Du alles richtig gemacht hast). Somit müßte da stehen

| fld qword [_LC11]
| fistp dword [esp]
|
| fld qword [_LC12]
| fistp dword [esp+4]
|
| fld qword [_LC13]
| fistp dword [esp+8]

um die richtigen Adressen zu treffen.

Danach kommt dann

push 3



was den esp auf 0x08 setzt und dort die 3 hinschreibt,

push dword _LCta



-> esp = 0x04, &_LCta dorthin

push dword array_myArray



-> esp = 0x00, array_myArray dorthin.


Und dann ist alles bereit für den

call get_array_value



.

Disclaimer: Ob da noch irgendwelche Syntax- oder sonstige Fehler
verborgen sind - keine Ahnung. Das war nur das, was mir am
offensichtlichsten erschien.


Du könntest auch gleich den esp dorthin setzen, wo er spàter stehen soll
(in diesem Beispiel auf die relative Adresse 0x00), und die ganze
Stackbeschickung mit mov machen. Dann wàre die Vorgehensweise

sub esp, 24
fld qword [_LC11]
fistp dword [esp+12]
fld qword [_LC12]
fistp dword [esp+16]
fld qword [_LC13]
fistp dword [esp+20]
mov [esp+8], 3
mov [esp+4], _LCta
mov [esp], array_myArray
call get_array_value

D.h. Deine Indizes stimmen auch dann nicht, aber dann sind andere Werte
erforderlich als sonst.

Btw: Da Du die folgenden Werte eh in Integer wandelst,

_LC11: dq 1.00
_LC12: dq 2.00
_LC13: dq 3.00



gibt es einen Grund, sie erst als Float zu speichern?


Thomas

Ähnliche fragen