PDA

View Full Version : [assembly&c]chiamate di funzioni


rschirin
23-05-2010, 01:38
ragazzi volevo sapere se è possibile chiamare una funzione scritta in C da una porzione di codice scritta in linguaggio assembly. è possibile fare il contrario?cioè chiamare una funzione assembly da un codice scritto in c. magari con motivazione....grazie:confused:

DanieleC88
23-05-2010, 09:22
Certo che è possibile.

morgoth90
23-05-2010, 11:57
.global funzione

funzione:
...codice asm...



extern void funzione();

void boh()
{
funzione();
}

!k-0t1c!
23-05-2010, 12:53
Se usi visual studio puoi usare facilmente l'assembly inline usando


__asm {
...CODICE ASSEMBLY - SINTASSI INTEL...
}


So per certo che è possibile fare qualcosa di simile anche su GCC usando l'orrenda sintassi AT&T...naturalmente magari esistono altri metodi con GCC che mi sfuggono.

Ad ogni modo fai una ricerca su google tipo "inline assembly" NOME_COMPILATORE e trovi tutto.

Ricordati che, per ragioni di portabilità (specialmente nell'ottica dei 64bit) usare l'assembly dovrebbe essere fatto solo in caso di emergenza.

pabloski
23-05-2010, 14:18
ragazzi volevo sapere se è possibile chiamare una funzione scritta in C da una porzione di codice scritta in linguaggio assembly. è possibile fare il contrario?cioè chiamare una funzione assembly da un codice scritto in c. magari con motivazione....grazie:confused:

si può fare senza problemi....

però a differenza del C devi preparare lo stack ( mettere nello stack i parametri da passare alla funzione e riservare lo spazio per i dati ritornati dalla funzione ), poi fai semplicemente CALL nome-funzione

la parte relativa allo stack è quella che riguarda le cosidette convenzioni di chiamata che dipendono dal linguaggio e/o dal compilatore usato

fai una ricerca per le key "cdecl" "stdcall" "fastcall"

p.s. riguardo il contrario è ovviamente possibile, però il discorso cambia e cioè è la funzione a dover tener conto delle convenzioni di chiamata e quindi sapere come il compilatore C ha messo i parametri nello stack e dov'è localizzata l'area che conterrà i dati di ritorno

in sostanza il punto in entrambi i casi è che in assembly non hai il runtime che si occupa di leggere/scrivere i parametri sullo stack ma devi farlo manualmente

rschirin
26-05-2010, 14:11
se dentro un sorgente C voglio mettere del codice assembly, ho capito che posso usare il procedimento inline assembly. ma se volessi fare il contrario, il procedimento prende un nome specifico?


poi...dentro assembly è possibile mettere istruzioni del C perchè il compilatore riuscirà a tradurre tranquillamente quelle istruzioni di C in linguaggio assembly?

pabloski
26-05-2010, 14:18
se dentro un sorgente C voglio mettere del codice assembly, ho capito che posso usare il procedimento inline assembly. ma se volessi fare il contrario, il procedimento prende un nome specifico?


poi...dentro assembly è possibile mettere istruzioni del C perchè il compilatore riuscirà a tradurre tranquillamente quelle istruzioni di C in linguaggio assembly?

no, il compilatore C normalmente è in grado di accettare codice assembly, ma l'assembler non è in grado di tradurre il codice in C

se crei un programma tutto in assembly e lo compili tramite un assembler non puoi metterci codice C

l'unico modo per metterci codice C è di scrivere in programma in C, mettere l'assembly tramite inlining e farlo compilare dal compilatore C

rschirin
26-05-2010, 16:26
no, il compilatore C normalmente è in grado di accettare codice assembly, ma l'assembler non è in grado di tradurre il codice in C

se crei un programma tutto in assembly e lo compili tramite un assembler non puoi metterci codice C

l'unico modo per metterci codice C è di scrivere il programma in C, mettere l'assembly tramite inlining e farlo compilare dal compilatore C

allora continuo a non capire....tornando al mio primo post:
in un codice C si può richiamare una funzione scritta in assembly?sì
in un codice assembly si può richiamare una funzione scritta in C?no

pabloski
26-05-2010, 16:32
in un codice C si può richiamare una funzione scritta in assembly?sì
in un codice assembly si può richiamare una funzione scritta in C?no

c'è un dettaglio che ti sfugge....

quando parliamo di richiamare una funzione C da un programma assembly possiamo benissimo riferirci ad un programma assembly che richiama una funzione C ma presente in una libreria esterna

se invece intendi incorporare una funzione C in un file .asm allora non è possibile perchè l'assembler non è in grado di tradurre il C, mentre qualsiasi compilatore C è capace di tradurre l'assembly

DanieleC88
26-05-2010, 16:33
Si può fare in entrambi i casi.

pabloski
26-05-2010, 17:26
Si può fare in entrambi i casi.

da come l'ho capita io, lui si riferisce alla possibilità di embedding del codice C in un listato assembly

o meglio, forse confuso dal fatto che in C si può embeddare codice assembly ha logicamente pensato che valesse pure il viceversa

rschirin
26-05-2010, 17:51
c'è un dettaglio che ti sfugge....

quando parliamo di richiamare una funzione C da un programma assembly possiamo benissimo riferirci ad un programma assembly che richiama una funzione C ma presente in una libreria esterna

se invece intendi incorporare una funzione C in un file .asm allora non è possibile perchè l'assembler non è in grado di tradurre il C, mentre qualsiasi compilatore C è capace di tradurre l'assembly

ecco il cetriolo alloraaaaaa....in realtà non è che mi sfuggiva, semplicemente non era una cosa che interessava il mio caso perchè mi riferivo a codice scritto da me(o comunque livello di difficoltà pari a zero, poco più di hello world per intenderci).