Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Assembler inline
Forum - C/C++ - Assembler inline - Pagina 2

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
arack95 (Member)
Pro


Messaggi: 144
Iscritto: 15/11/2010

Segnala al moderatore
Postato alle 1:30
Sabato, 13/08/2011
Testo quotato

Postato originariamente da comina8:

Testo quotato

Postato originariamente da arack95:

No non ti conviene, in genere si usa per fare ottimizzazioni ma non farlo se non è proprio necessario, ecco tre motivazioni:
1) Rendi il codice osceno;
2) Avrai problemi per i vari compilatori se supportano l'at&t o l'intel, per esempio gcc usa gas come assembler, che usa la sintassi at&t, mentre quello di vs usa l'intel;
3) Rendendi il codice dipendente dalla piattaforma;

Finché non sei obbligato evita :k:



1) Non è un problema
2) I compilatori che mi interessano sono gcc e mingw
3) Beh se devo solo fare mov e add non penso...



Fai come vuoi dopotutto ognuno è libero di fare ciò che vuole, io il mio parere l'ho dato. E poi cosa pensi di migliorare usando mov e add in assembly? Vorrei proprio vedere cosa pensi di aver ottimizzato, mi farei volentieri due risate stasera :(

PM Quote
Avatar
comina8 (Normal User)
Pro


Messaggi: 86
Iscritto: 18/06/2011

Segnala al moderatore
Postato alle 11:50
Sabato, 13/08/2011
Testo quotato

Postato originariamente da arack95:

Testo quotato

Postato originariamente da comina8:

Testo quotato

Postato originariamente da arack95:

No non ti conviene, in genere si usa per fare ottimizzazioni ma non farlo se non è proprio necessario, ecco tre motivazioni:
1) Rendi il codice osceno;
2) Avrai problemi per i vari compilatori se supportano l'at&t o l'intel, per esempio gcc usa gas come assembler, che usa la sintassi at&t, mentre quello di vs usa l'intel;
3) Rendendi il codice dipendente dalla piattaforma;

Finché non sei obbligato evita :k:



1) Non è un problema
2) I compilatori che mi interessano sono gcc e mingw
3) Beh se devo solo fare mov e add non penso...



Fai come vuoi dopotutto ognuno è libero di fare ciò che vuole, io il mio parere l'ho dato. E poi cosa pensi di migliorare usando mov e add in assembly? Vorrei proprio vedere cosa pensi di aver ottimizzato, mi farei volentieri due risate stasera :(



Era solo per fare un esempio, comunque l'ho specificato nel primo post: "anche solo per curiosità", non devo mica venderla sta libreria XD

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 15:08
Sabato, 13/08/2011
ha ragione arack...

se vuoi imparare l'assembly, scrivi un sorgente intero in tale linguaggio. Poi linkalo ad un programma C e richiama le sue funzioni rispettando il linkage C STDCALL.

Se usi l'inline asm fai solo porcate, viola praticamente TUTTI i paradigmi della buona programmazione in un colpo solo (incapsulamento, astrazione, portabilità, leggibilità, manutenibilità, modularità, ecc...).

PM Quote
Avatar
comina8 (Normal User)
Pro


Messaggi: 86
Iscritto: 18/06/2011

Segnala al moderatore
Postato alle 15:33
Sabato, 13/08/2011
Testo quotato

Postato originariamente da TheKaneB:

ha ragione arack...

se vuoi imparare l'assembly, scrivi un sorgente intero in tale linguaggio. Poi linkalo ad un programma C e richiama le sue funzioni rispettando il linkage C STDCALL.

Se usi l'inline asm fai solo porcate, viola praticamente TUTTI i paradigmi della buona programmazione in un colpo solo (incapsulamento, astrazione, portabilità, leggibilità, manutenibilità, modularità, ecc...).



http://www.ingmonti.it/libri/Parte2/16%20ASM%20C.pdf.
Pag 7 "Collegamento al C di procedure scritte in Assembly", intendevi questo?
Grazie comunque del consiglio ora vedo come posso fare.
Avevo scelto l'assembly inline per non dover scrivere tutte le procedure per intero ma solo qualche pezzo. Comunque una volta ottenuto il file ".asm" o ".s" poi vedo quale usare devo creare l'oggetto da linkare al momento della compilazione?

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 15:41
Sabato, 13/08/2011
si, in realtà creare un file separato è più facile :-)

Poi ti basta inserire una regola nel makefile (impara ad usare i makefiles!) che ti genera i file oggetto usando come riga di comando il tuo assembler preferito (io usavo NASM) e una volta compilati, i file oggetto saranno identici a quelli fatti in C, quindi potrai linkarli usando il normale linker.

PM Quote
Avatar
comina8 (Normal User)
Pro


Messaggi: 86
Iscritto: 18/06/2011

Segnala al moderatore
Postato alle 15:53
Sabato, 13/08/2011
Testo quotato

Postato originariamente da TheKaneB:

si, in realtà creare un file separato è più facile :-)

Poi ti basta inserire una regola nel makefile (impara ad usare i makefiles!) che ti genera i file oggetto usando come riga di comando il tuo assembler preferito (io usavo NASM) e una volta compilati, i file oggetto saranno identici a quelli fatti in C, quindi potrai linkarli usando il normale linker.



Ok penso di aver capito..
Quindi (tralasciando temporaneamente i makefiles):

main.c

extern "C"
{
   int Somma(int a, int b);
}

int main()
{
   int var1=10;
   int var2=10;
   int somma=Somma(var1,var2);
   ...
}

somma.asm

Somma proc
...
Somma endp

Compilo somma.asm, linko l'oggetto al compilatore c, compilo main.cpp e dovrei aver tutto?

Solo come le riconosce l'assembler i parametri C? (per questo forse dovrei studiare direttamente il linguaggio...)

Ultima modifica effettuata da comina8 il 13/08/2011 alle 15:56
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 19:14
Sabato, 13/08/2011
esatto, hai capito il meccanismo :-)

Il passaggio dei parametri è descritto dalla cosiddetta ABI del sistema.

L'ABI cambia da un OS all'altro, da un'architettura all'altra, da un compilatore all'altro, insomma studia :D

In linea di massima i parametri vengono pushati nello stack in ordine da destra verso sinistra (così la funzione in ASM fa "pop" e si ritrova il primo parametro pronto), e il registro eax viene generalmente usato per il valore di ritorno.

http://en.wikipedia.org/wiki/X86_calling_conventions

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo