Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Assembly, C++: Inline ASM

Lare [01.10.2002 21:11:20]

#

Olisi vähän kysyttävää:
1. Mitä tarvitaan voidakseni kirjoittaa inline assya DJGPP:tä käyttäen
2. Miten kirjoitan sitä? Tulee aina jotain erroreitan, kun olen yrittänyt.

Vilikki [01.10.2002 22:03:00]

#

2. pitäisi onnistua, kun kirjoitat vain:
_asm
{

} //ja koodi tuohon äskeiseen väliin, en nyt muista assemblyn kommentinmerkintää...

En mene takuuseen, mutta muistelen, että se meni noin. Sitten 1. ei siihen vissiinkään mitään. En ole tosin kertaakaan käyttänyt (c++:sta osaan perusteet, assemblerista jotain hyvin pientä perusjuttua...)

thefox [01.10.2002 22:12:03]

#

Onnistuuko DJGPP:llä noin? Ei muistaakseni mutta one can never be sure.
Assemblyn kommenttimerkki on ; eli puolipiste.

Hipo [01.10.2002 22:41:15]

#

DJGPP:n eli gcc:n käyttämä inline assemblerin syntaxi on tosi mielenkiintoista. Pelkän gnu assemblerinki syntaxi poikkeaa kovin intelin syntaxista, esimerkiksi järjestys on kohde,lähde sijaan lähde,kohde. Sen lisäksi rekisterit ja numerot ja muut vaatii eteensä merkin kertomaan tyypistä. Senpä takia en oo ite käyttäny sitä, vaan kääntäny nasmilla omat funktiot DJGPP:n käyttämään coff-objektiformaattiin. Täs on liikaakin tekstiä mut menköön. :) Esimerkkinä Linuxin sorsista tiedosto arch/i386/lib/strstr.c:

#include <linux/string.h>

char * strstr(const char * cs,const char * ct)
{
int     d0, d1;
register char * __res;
__asm__ __volatile__(
        "movl %6,%%edi\n\t"
        "repne\n\t"
        "scasb\n\t"
        "notl %%ecx\n\t"
        "decl %%ecx\n\t"        /* NOTE! This also sets Z if searchstring='' */
        "movl %%ecx,%%edx\n"
        "1:\tmovl %6,%%edi\n\t"
        "movl %%esi,%%eax\n\t"
        "movl %%edx,%%ecx\n\t"
        "repe\n\t"
        "cmpsb\n\t"
        "je 2f\n\t"             /* also works for empty string, see above */
        "xchgl %%eax,%%esi\n\t"
        "incl %%esi\n\t"
        "cmpb $0,-1(%%eax)\n\t"
        "jne 1b\n\t"
        "xorl %%eax,%%eax\n\t"
        "2:"
        :"=a" (__res), "=&c" (d0), "=&S" (d1)
        :"0" (0), "1" (0xffffffff), "2" (cs), "g" (ct)
        :"dx", "di");
return __res;
}

Jos itse joutus vääntämään inline asmia niin vääntäsin varmaan intelin syntaxia ja kääntäsin intel2gas ohjelmal gnu assemblerille. Lopussa olevat kolme kaksoispisteellä alkavaa riviä kertoo parametreista assemblerille.

Hipo [01.10.2002 22:42:21]

#

Hrmh. Se muokkaus olis kyllä kätevä ominaisuus tähän foorumiin kun unohtu kooditagi.

thefox [04.10.2002 22:04:57]

#

Näinhän se on. DJGPP:llä inline-asmin käyttö on pelkkää tuskaa. Mutta nasm+djgpp onkin sitten ihan toimiva yhdistelmä.
Visual C++:ssa inline asmin tunkeminen on pelkkää juhlaa ;)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta