Wo zum Teufel ist hier der Rückgabewert???

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 :wink:


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 :slight_smile:


ah, coole sache