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.
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...)
Onnistuuko DJGPP:llä noin? Ei muistaakseni mutta one can never be sure.
Assemblyn kommenttimerkki on ; eli puolipiste.
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.
Hrmh. Se muokkaus olis kyllä kätevä ominaisuus tähän foorumiin kun unohtu kooditagi.
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 ;)
Aihe on jo aika vanha, joten et voi enää vastata siihen.