PDA

View Full Version : assembler e compilatori


HellGauss
03-09-2005, 10:34
Salve a tutti, sono un programmatore dilettante che ha imparato ad usare il visualC++ di MS in maniera autonoma, leggendo ogni tanto qualche libro e sfogliando l'help delle msdn. Avevo però intenzione di passare ad una suite di lavoro opensource o cmq free, anche per scelta ideologica. Mi sono buttato su dev-cpp, con il proposito di imparare ad usare le Qt, che pare siano le librerie del futuro. Fin qui nessun problema.

Il problema è che a volte, per aumentare la velocità, scrivevo codice direttamente in assembler. Il compilatore di MS supporta però una sintassi asm (la sintassi 'Intel') diversa da quella del compilatore di dev-cpp (mi pare sia il gcc, che in assembler supporta sintassi 'at&t'). Non ho il tempo materiale di imparare una nuova sintassi asm (tra l'altro tutti gli esempi di codice asm che scarico sono in modalità 'intel').

C'è una maniera veloce per far funzionare questo pezzo di codice, che su visual studio funziona benissimo, ma su devcppp dà errore?

__asm // rr ii r i 4 tmp
{
finit;
fld1;
fadd st(0),st(0);
fadd st(0),st(0);
fld i;
fld r;
fldz;
fldz;
mov ecx,maxit;
label1:
fst st(5);
fmul st(0),st(0);
fxch st(1);
fst st(6)
fmul st(0),st(0);
fadd st(0),st(1);

fcomi st,st(4);
ja label2;

fsub st(0),st(1);
fsub st(1),st(0);
fxch st(5);
fmul st(0),st(6);
fadd st(0),st(0);
fadd st(0),st(3);
fxch st(1);
fadd st(0),st(2);

dec ecx;
jecxz label2;
jmp label1;

label2:
mov t,ecx;
}

Il programma completo è qui (sono una manciata di kb):

http://xoomer.virgilio.it/jbgenov/mand.cpp

Ciao a tutti e grazie!
HG

cionci
03-09-2005, 12:20
http://racl.oltrelinux.com/tutorial/gas.html

lovaz
04-09-2005, 11:38
Un consiglio, comunque: usa linguaggi di alto livello, quando possibile. ;)

HellGauss
05-09-2005, 07:50
Devo per forza usare l'assembler. Ho scritto un programma analogo con interfaccia grafica per creare frattali a colori e stamparli su grande formato. Alcune elaborazioni mi hanno richiesto più di una settimana di cpu. La routine in c era sette volte più lenta a causa di inutili accessi alla memoria, quindi inutilizzabile.

Il programma era scritto su MS Visual Studio con le api di windows. Volevo passare a qt e a suite libere, solo che il dev-cpp e anche eclipse supportano una sintassi diversa dell'assembler inline. Ho letto di un opzione da passare da riga di comando a gcc ( -masm=intel ), ma non funziona.
Ho letto anche in giro che la sintassi intel può venire usata in modi differenti dal mio. Ad esempio asm invece di __asm, oppure __asm__, oppure con asm("....") invece di asm{....}.

Speravo di trovare un modo per far capire l'assembler intel a gcc, ma mi pare di aver capito che non è possibile.

In ogni caso grazie per le risposte.
HG

cionci
05-09-2005, 08:20
Ti ci vuole davvero poco a tradurla, basta farti uno schema...

Comunque: http://www.niksula.cs.hut.fi/~mtiihone/intel2gas/
Google rules ;)

HellGauss
05-09-2005, 16:36
Quel programmino mi pare sia per linux..... :-(
Cmq mi armo di tanta pazienza e provo a tradurre il codice. Forse è vero.... non è così difficile. Nel caso tra qlc giorno se non va ripesco il topic e torno a rompervi le scatole :-)

A presto e grazie
HG

HellGauss
13-09-2005, 17:26
UP :-)

Ho cambiato il codice iniziale con questo, e ho aggiunto l'opzione -masm=intel alle opzioni di compilazione.

__asm // rr ii r i 4 tmp

(
"finit;"
"fld1;"

"fadd st(0),st(0);"
"fadd st(0),st(0);"
"fld i;"
"fld r;"
"fldz;"
"fldz;"
"mov ecx,maxit;"

"label1:"
"fst st(5);"
"fmul st(0),st(0);"
"fxch st(1);"
"fst st(6)"
"fmul st(0),st(0);"
"fadd st(0),st(1);"

"fcomi st,st(4);"
"ja label2;"

"fsub st(0),st(1);"
"fsub st(1),st(0);"
"fxch st(5);"
"fmul st(0),st(6);"
"fadd st(0),st(0);"
"fadd st(0),st(3);"
"fxch st(1);"
"fadd st(0),st(2);"

"dec ecx;"
"jecxz label2;"
"jmp label1;"

"label2:"
"mov t,ecx;"
);

Sicuramente ha riconosciuto la sintassi intel, dato che senza l'opzione mi dava numerosi errori. Con questo mi da solo:
suffix or operands invalid for 'fst'
La suite di lavoro è dev-cpp

cionci
13-09-2005, 17:42
Devi aggiungerela la dimensione degli operatori quando non è già esplicita...ora non mi ricordo bene... Comunque deve aggiungere una lettera (che non ricordo) alle istruzioni a seconda se vuoi operare a 32, 64 o 80 bit...

HellGauss
13-09-2005, 19:05
Era un ;..... ho la testa fusa.
Il fatto è che risolvo un problema e me se ne pone un altro.
Messo il ; non mi trovava le variabili esterne, dandomi un errore in fase di link. Con l'aiuto di google ho risolto anche quello. Però ora il programma mi va inspiegabilmente lento, e l'output non è quello che deve essere (però non da errore). Ho provato a fare un debug con dev-cpp, ma non posso andare a vedere cosa succede nel codice assembler (con msvc potevo farlo..... )
Penso che dovrò sbattere la testa ancora a lungo.....