Not logged in. · Lost password · Register

MatthiasM
Avatar
Member since Nov 2003
459 posts
Subject: 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?
Der Computer ist ein mechanischer Hohlkopf.
The Void
Griesgram und Zyniker
Member since Oct 2002
154 posts
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).
Welcome to the worst nightmare of all --- Reality!
MatthiasM
Avatar
Member since Nov 2003
459 posts
Aha. Danke für die Info!
Der Computer ist ein mechanischer Hohlkopf.
Ford Prefect
Pangalaktischer- Donnergurgler-Trinker
(Administrator)
Avatar
Member since Oct 2002
3266 posts
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.
Quote: <mute> mit Miranda macht irc kein spass :P <Loki|muh> dann geh doch wieder :)
<mute> ich benutze kein miranda <Loki|muh> na und? :)
MatthiasM
Avatar
Member since Nov 2003
459 posts
Zum Glück habe ich gefragt, sonst hätte ich heute in der Klausur alt ausgesehen ;)
Der Computer ist ein mechanischer Hohlkopf.
The Void
Griesgram und Zyniker
Member since Oct 2002
154 posts
wieso sollte man eine gleitkommazahl nicht im register hinterlassen?

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 :)
Welcome to the worst nightmare of all --- Reality!
Ford Prefect
Pangalaktischer- Donnergurgler-Trinker
(Administrator)
Avatar
Member since Oct 2002
3266 posts
ah, coole sache
Quote: <mute> mit Miranda macht irc kein spass :P <Loki|muh> dann geh doch wieder :)
<mute> ich benutze kein miranda <Loki|muh> na und? :)
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Go to forum
Datenschutz | Kontakt
Powered by the Unclassified NewsBoard software, 20150713-dev, © 2003-2011 by Yves Goergen