Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
Wo zum Teufel ist hier der Rückgabewert???
Ich kann den Rückgabewert nicht finden. Bitte mal den folgenden Code ansehen (funktioniert mit VC++ 5/6.0):
#include <iostream.h> /* cout /
#include <stdio.h> / getchar */
int main();
void SetToZero(long *v);
long Print(long v);
int main()
{
long a;
_asm
{
mov a, 10;
mov eax, a;
test eax, 15;
jg AddTen;
jmp Exit;
AddTen:
mov eax, a;
add eax, 10;
mov a, eax;
Exit:
mov eax, a;
shl eax, 4; ; multiply by 2 ^ 4 = 16
mov a, eax;
}
cout << a << "\n";
SetToZero(&a);
_asm
{
mov a, 10;
push a;
call Print;
add esp, 4;
push ebp;
call Print;
add esp, 4;
push esp;
call Print;
add esp, 4;
mov a, 20;
push a;
call Print; // returns 1
mov ebx, [esp - 8]; // where's the 1?
mov a, ebx; // print content of memory at address esp
add esp, 4;
}
cout << a << "\n";
cin >> a;
}
void SetToZero(long *v)
{
_asm
{
mov eax, v;
mov ebx, [eax + 0];
xor ebx, ebx;
mov [eax + 0], ebx;
}
}
long Print(long v)
{
cout << v << “\n”;
return 1;
}
Also ich pushe das v für Print auf den Stack, rufe Print auf, und addiere danach wieder 4 zum Stack. Aber wo ist die 1, die von Print zurückgegeben wurde?
Rückgabewerte stehen nach Konvention im EAX Register und liegen nicht auf dem Stack, gilt aber AFAIK nur für int/long und Zeiger. Gleitkommawerte müssten ein Fall für den Stack sein (bin mir aber nicht 100%ig sicher).
Aha. Danke für die Info!
wieso sollte man eine gleitkommazahl nicht im register hinterlassen?
Problematisch werden Rückgabetypen, die größer sind, als ein Wort, z.B. long long oder double. Ein normaler float gehört da aber nicht dazu.
Zum Glück habe ich gefragt, sonst hätte ich heute in der Klausur alt ausgesehen
Da hast du Recht. float und double Rückgabewerte werden mit einem Register übergeben, allerdings ist das nicht das EAX, sondern das ST(0) (Register 0 der FPU). Der Rückgabewert kann dann mit einer fstps (für float) oder fstpl (für double) Anweisung an eine Speicheradresse kopiert werden.
Für OTRS4 ist das aber nicht wichtig, wird aber jetzt schon egal sein
ah, coole sache