Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

adapto

Treue Seele

  • »adapto« ist der Autor dieses Themas

Beiträge: 147

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

1

07.06.2004, 17:33

register zurückgeben

wenn ich zb sowas habe:

Quellcode

1
2
3
4
5
6
7
8
9
10
int funktion()
{
__asm
{
// hier passiert was
// ergebnis in eax
}

return ???;
}


wie übergebe ich dann das register als rückgabewert?

danke&gruß
adapto

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

07.06.2004, 18:28

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int funktion( void ) 
{

    int r;

    __asm 
    {
        // hier passiert was 
        // ergebnis in eax 

        mov r, eax

    }

    return r;
}


is nicht getestet, aber ich denk so könnts gehen.
außerdem kannst du noch über den stack gehen oder einfach eine naked prozedur verwenden.

mehr fällt mir im moment nicht ein.

3

07.06.2004, 21:35

Wie wäre es wenn du die Variable direkt benutzt? Heißt ja nicht umsonst Inline Assembler ;)
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

adapto

Treue Seele

  • »adapto« ist der Autor dieses Themas

Beiträge: 147

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

4

08.06.2004, 01:16

jungs,
es muss doch eine direkte möglichkeit geben!

@dot
so mach ich es auch im moment, aber es muss doch sowas wie

Quellcode

1
"return REGISTER"

oder so geben.

hab mal irgendwo sowas hier gesehen:

Quellcode

1
mov funktion, eax

aber das funktoniert bei mir nicht

@DragonMaster
naja, speicheradressen sind halt langsamer als register. mein ergebnis ist halt am ende in einem register und ich will mir halt den umweg über eine zusätzliche variable sparen.

5

08.06.2004, 07:17

Da bleibt dir nur die Möglichkeit eine Naked Funktion zu nehmen. Denn die resturn-Anweisung ist nicht mehr Teil des Assembler.

Es ist so. So wie die Parameter an einer bestimmten stelle abgelegt werden, wird auch der Returnwert in einem ganz bestimmten Register abgelegt. Denn in Assembler gibt es keinen Return-Wert. Welches Register das ist hängt vom Compiler ab. Die sind da alle Unterschiedlich. Schau da am besten in der Doku des Compilers nach.

Wenn du das Buch Spieleprogrammierung Gems 1 hast, kannst du auf Seite 68 nachschauen. Hier mal ein Ausschnitt:

Zitat

4. Einfache Nicht-Fließkommawerte wie Integers und Pointer werden im EAX-Register gespeichert. Acht-Byte-Strukturen werden in EDX und EAX als Paar gespeichert. float und double werden über die FPU in ST0 zurückgegeben. Rückgabewerte für Benutzerdefinierte Typen kriegen ihre Adresse als letztes auf den Stack gepusht, aber sie werden auch in EAX zurückgegeben.

Gilt für VC++ für x86 Windows-Systeme

So...ich hoffe das Hilft dir weiter.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

adapto

Treue Seele

  • »adapto« ist der Autor dieses Themas

Beiträge: 147

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

6

08.06.2004, 11:51

hi DragonMaster,
das war eine grosse hilfe. ich habs auch gleich getestet. mein compiler gibt zwar eine warnung aus aber es funktioniert. bei windows ist es wirklich standard rückgabewerte ins eax zu legen. so ist es auch bei den standard winapis. die anderen rückgaben mit 8byte(eax+edx) und float(st0) sind für mich neu.
die mehtode entspricht bestimmt nicht dem ansi standard aber im moment entwickel ich sowieso nur auf einer plattform und mit einem compiler und ausserdem gibts ja noch #ifdef.

so funktioniert es bei mir unter vc7 wunderbar:

Quellcode

1
2
3
4
5
6
7
8
9
10
DWORD32 funktion( void ) 
{ 
   __asm 
   { 
      // hier passiert was 
      // ergebnis in eax 
   } 

   return; 
} 

Zitat

So wie die Parameter an einer bestimmten stelle abgelegt werden

die kann man zb über

Quellcode

1
mov     eax,dword ptr [ebp+8]

vom stack holen.

vielen dank für deine hilfe.

p.s.: die gems reihe habe ich nicht werde sie mir aber noch zulegen, da ich ständig was darüber lese und es durchweg nur positive kritik gibt.

Werbeanzeige