gcc: long long a asm

Milan Pikula - WWW www na fornax.elf.stuba.sk
Čtvrtek Květen 27 17:34:01 CEST 1999


On Tue, 25 May 1999, Pavel Machek wrote:

W>Ahoj!
W>
W>> potrebuji v C pouzit assembler (i386) a z nej zavolat funkci, ktera
W>> vraci typ long long, tedy asi takto:
W>
W>Podle me tohle nesmis.

zdar.. priznavam sa, ze som to v zivote nerobil, takze som sa neozval ked
som cital prvy mail. ked som videl toto, uz mi to nedalo, tak som naklepal
takyto program:

unsigned long long testik(int x)
{
        printf ("Testik 0x%.8x\n", x);
        return 0x10101010f0f0f0f0ll;
}

void main(void)
{
        long long bla = -1;
        printf ("0x%.16Lx\n", bla);
        __asm__(
                "pushl $0x12345678\n\t"
                "call testik\n\t"
                : "=da" (bla)
        );
        printf ("0x%.16Lx\n", bla);
}

na moje velke prekvapenie na prvy krat bezal.

W>> Jeste otazka: k cemu presne jsou pouzity registry edi, esi a ebx? Gcc,
W>> pokud je pouziva, si je vzdy uschova a na konci funkce obnovi.
W>
W>To bude souviset s volaci konvenci...

spravil som si programcek, ktory mi tie registre vypisal. vyzera to takto:
ESI=0x00000000
EDI=0xbffffb60
EBX=0xbffffb40

v preklade do slovenciny je ESI asi pointer na zaciatok pamati alebo podobna
hovadina, EDI je 4A0 od konca zasobnika a EBX 480 od konca. co konkretne tam
je bude treba pozriet asi v zdrojakoch c0, ktore tu teraz nemam..

--
Milan Pikula, WWW. Finger me for Geek Code.
http://fornax.elf.stuba.sk/~www, www na fornax.elf.stuba.sk
.. dajte mi pewnu linku a pohnem zemegulow ..




Další informace o konferenci Linux