160 likes | 289 Views
INTERFACCIAMENTO ASSEMBLY - C++. Prof. Marco Solarino. Interfacciare l'Assembly con un linguaggio ad alto livello significa utilizzare del codice scritto in linguaggio Assembly all'interno di un'applicazione realizzata con l'altro linguaggio (nel nostro caso il C++). IN COSA CONSISTE.
E N D
INTERFACCIAMENTO ASSEMBLY - C++ Prof. Marco Solarino
Interfacciare l'Assembly con un linguaggio ad alto livello significa utilizzare del codice scritto in linguaggio Assembly all'interno di un'applicazione realizzata con l'altro linguaggio (nel nostro caso il C++). IN COSA CONSISTE
Funzioni particolari Velocità di esecuzione Compattezza del codice A COSA SERVE Interfacciare l'Assembly con un linguaggio ad alto livello può essere utile per ottenere:
Esistono due modalità per realizzare l'interfacciamento Assembly-C++: COME SI REALIZZA • Interfacciamento interno • Interfacciamento esterno
Il TurboC++ contiene un assemblatore interno (il BASM, Borland Assembler) che offre un sottoinsieme delle potenzialità del TASM (Turbo Assembler) e ci consente di inserire istruzioni in Assembly nel sorgente scritto in C++ (Assembly inline). INTERFACCIAMENTO INTERNO
Per invocare il BASM e tradurre l'Assembly si antepone la direttiva asm alle istruzioni interessate: INTERFACCIAMENTO INTERNOCome si fa nel TurboC++ asm MOV AX,1000 Se le istruzioni Assembly sono più di una: asm { Istruzioni Assembly }
Dopo la direttiva asm vale come terminazione dell'istruzione anche l'a capo oltre al punto e virgola, quindi l'eventuale parentesi graffa va aperta sulla stessa riga di asm. INTERFACCIAMENTO INTERNOAttenzione!
Alcuni compilatori non consentono di usare le etichette nell'Assembly inline Non si possono usare macro e procedure INTERFACCIAMENTO INTERNOLimiti In pratica l'interfacciamento interno va usato in casi molto semplici, nei quali si debbano usare poche istruzioni Assembly.
Sorgente *.CPP Eseguibile *.EXE ? Sorgente *.ASM INTERFACCIAMENTO ESTERNO I sorgenti sono almeno due
Sorgente *.CPP Oggetto *.OBJ Eseguibile *.EXE Sorgente *.ASM Oggetto *.OBJ INTERFACCIAMENTO ESTERNO Generico Compilatore (TurboC++) LINKER (TLINK) Assemblatore (TASM)
File di progetto *.prj Eseguibile *.EXE Sorgente *.CPP Sorgente *.ASM INTERFACCIAMENTO ESTERNO Nel TurboC++
Far capire al compilatore C++ che la funzione Assembly non è nel sorgente *.cpp Rendere visibile al linker la funzione Assembly INTERFACCIAMENTO ESTERNOProblemi
INTERFACCIAMENTO ESTERNOCosa c’è nel cpp Prima di utilizzarla, facciamo capire al C++ che la funzione Assembly è esterna : extern “C” {tipo far nome(parametri);... tipo far nome(parametri);} Per esempio: extern “C” {int far doppio(int x);}
INTERFACCIAMENTO ESTERNOCosa c’è nell’asm (1) Al nome della funzione va anteposto ‘_’: …o lo facciamo noi _ doppio proc far …o lo facciamo fare al TASM .model small,C
INTERFACCIAMENTO ESTERNOCosa c’è nell’asm (2) Rendiamo visibile (pubblica) la funzione al linker PUBLIC doppio se abbiamo usato , altrimenti .model small,C PUBLIC _doppio
INTERFACCIAMENTO ESTERNOCosa non c’è nell’asm Siccome i segmenti dati e stack vengono definiti dal C++, il sorgente *.asm non dovrà contenere le direttive .data e .stack. Dato che il main della nostra applicazione è nel sorgente *.cpp, il sorgente *.asm non dovrà contenere le macro .startup e .exit 0.