Newsgroup: it.comp.os.linux.development
Titolo: Scrivere direttamente in memoria

Ho postato questo messaggio su it.comp.software.os.linux.iniziare e mi hanno
consigliato di provare su questo NG.
Scusate perciņ se avete gią letto questo msg:
Sono finalmente riuscito a far funzionare decentemente Linux (RH 6.2).
Ora vorrei cominciare a compilare i miei programmi in C++ per il Turbo C
(Dos) della Borland sotto Linux.
Mi si č presentato un problema fondamentale: in quasi tutti i giochi scritti
da me il programma va a scrivere direttamente nella memoria video (segmento
b800h) con le funzioni pokeb e pokew (in pratica vado a modificare
direttamente i caratteri e i loro attributi).
Queste due funzioni fanno parte della libreria <dos.h> che ovviamente non
esiste in Linux.
Ho provato allora ad usare il comando:
asm {
 // scrivi istruzioni in assembler
}
Ma anche quello non funziona.
Quindi mi potreste dire come si fa a scrivere in una locazione di memoria
(anche esterna al programma) in ambiente Linux ? (e possibilmente anche come
si usa in Linux 'asm' per il C sotto Dos ? )
Vi ringrazio in anticipo per le risposte, ciao.

 Vi ringrazio in anticipo per le risposte, ciao.
il dos.h ovviamente non c'è (wherex e whwrey per es non ci sono e tante
altre cose per esempio della lib conio.h) ti devi affidare alle svalib
(man svaglib) che ti consentono un accesso a medio livello sulla scheda
video in modalità consol - superuser
sicuramente con la rh6.2 l'avrai già installata percui enjoy!
 
___________________________________________________________
                    _
 \ \// // //| | // |_ _|_|_ member of EventOrizon software
  \//\// // | |//  |_  | |   
http://members.xoom.it/wavexx
___________________________________________________________

Thanks !

Ho letto varie FAQ, HOWTO, ecc.
Ma il problema per l'uso di ASM e __ASM__ è che:
se non specifico nessuna opzione non me li accetta se specifico -ANSI non me
li accetta ugualmente (mi da esattamente gli stessi errori).
C'è una opzione per abilitare l'uso di __ASM__ e ASM ?
Oppure dove posso modificare il default ?
Grazie ancora e ciao.


mmh... da quello che vedo ti "ostini" a voler usare l'assmbler :))))
vabbè... allora per quello che ho capito usi l'inline asm giusto?
se non ricordo male il gcc vuole che i file che utilizzano tali
direttive siano disposti in file header (.h) in modo da avervi pieno
accesso e disposti in tale maniera:
__asm__ { "istruzione"
	  "istruzione" 
          ...
        }
ma come ti ho detto usare l'assemler in unix è in 90% compito li
librerie e kernel
se devi invece creare un programma allora ti consiglio nasm (fai una
piccola ricerca e lo trovi subito), è un compilatore specifico assempler
per u*x!
il gcc offre poi l'opzione -Wa,opzione in cui specifichi le opzioni del
preprocessore ma quì haimè devi guardarti la pagina di man (man gcc)
perchè le opzioni sono molte.
oppure ultimo ma non ultimo c'è as (compilatore gnu assembler) che
sicuramente avrai installato (man as)
_divertiti_ =P


Grazie ancora.

}
naturalmente sotto dos nessuna delle feature per la protezione della memoria
veniva usata, sotto linux ogni programma che esca fuori dallo
spazio assegnatogli genera un bel segmantation fault.
dubito poi che riuscirai mai a compilare i tuoi programmi
con l'uso dell'assembler in linea, perchè (disgraziatamente)
la sintassi dell'asm in linea, sotto linux, segue uno standard diverso
dal dos, quindi preparati a riscrivere tutto' l'asm
con la micidiale sintassi AT&T, se ne vuoi un assaggio
compila un programma con la seguente linea di comando 
gcc -S prog.c
e guardati il file .s generato.
oppure dai uno sguardo nei sorgenti del kernel
che qualcosa in asm c'è (linux/arch/i386).
credo che il miglior modo per convertirei tuoi programmi sia questo:
1- separa il codice C dal codice asm e mettilo in file separati.
2- crea qualche header file per le funzioni in asm.
in questo modo puoi svincolarti dal assembler in linea del gcc
e usare nasm che ha una sintassi molto simile a quella che tu conosci.
non dimenticare di eliminare ogni istruzione che faccia riferimento
a locazioni di memoria particolari del dos, o le chiamate al bios.
una nota personale, con il gcc l'asm puoi ridurlo davvero
all'osso (al massimo le funzioni per il disegno
veloce sullo schermo, oppure se vuoi usare l'MMX)
in più di un'occasione il codice compilato dal gcc
era più veloce di quello in asm (esempio 
la copia di blocchi di memoria)