Per chi vuole iniziare sono disponibili tantissimi corsi di assembler,
il primo che mi viene in mente e` quello distribuito con la PC Game Programming
Encyclopedia, vedi sito FTPufficiale.
PCGPE e` una raccolta di tantissime informazioni:
oltre al corso di assembler sono compresi molti esempi in pascal su programmazione
3D, vari modi grafici, specifiche EMS, XMS, mouse, tastiera, e tanto altro.
Altra documentazione che non deve mancare a chi programma in assembler e` la
lista di Ralph Brown:
contiene tutta la lista delle chiamate tramite interrupt,
tutte le istruzioni delle CPU x86, i registri MSR, le porte di IO e i dispositivi
mappati in memoria. Potete anche scaricarlo da un
mirror simtelnet
Come scrivere programmi a 32 bit ?
Dipende molto dai programmi che utilizzate. In linea di massima se utilizzate il codice assembler assieme ad un
compilatore C, ci pensera` lui ad impostare le istruzioni a 32 bit, tutto quello che dovete fare voi e` utilizzare i
registri a 32 bit per qualsiasi riferimento alla memoria. Ad esempio se prima scrivevate MOV AX,[DI] ora dovete
scrivere MOV AX,[EDI], oltre a cio` spesso a 32 bit non e` necessario utilizzare esplicitamente i registri ES,GS,FS
perche` normalmente sono uguali a DS e SS. Ricordate anche di non inserire troppe istruzioni a 16 bit, perche` se il
programma e` a 32 bit, occuperanno piu` spazio del normale. Per il codice assembler ricordate di impostare la direttiva
per i 32 bit, ad esempio col NASM basta mettere BITS 32 all'inizio, mentre coi MASM/TASM bisogna indicare USE32 quando
si dichiara un segmento di dati/codice. Se scrivete tutto in assembler, potete utilizzare il DPMI per passare al modo a
16 bit, poi (con le chiamate apposite) create un segmento di codice/dati e passate il controllo alla procedura a 32 bit.
Nella sezione download trovate vari esempi.
Come conoscere la velocita` del computer ?
La velocita` della CPU puo` essere calcolata in vari modi, a seconda
delle esigenze. Particolarmente utile e` l'istruzione RDTSC presente nei
processori pentium. Questa istruzione scrive il numero di cicli di clock
trascorsi dall'ultimo reset nei registri EDX:EAX, percio` eseguendo la
differenza fra due successive letture separate da un intervallo di tempo
conosciuto si ricava facilmente la velocita`
della CPU espressa in Mhz (Mega Hertz). Ad esempio attendendo un
secondo fra le 2 istruzioni. Ora il problema e` come ottenere un
ritardo non dipendente dalla CPU impiegata, ma il problema e` facilmente
risolvibile, visto che la locazione di memoria all'indirizzo DWORD PTR [0040:006C]
viene automaticamente incrementata con una frequenza di circa 18.2065Hz.
Un modo alternativo e` quello di utilizzare l'orologio RTC leggendo il
CMOS, oppure catturare l'IRQ 0 (interrupt 8 per default) responsabile
dell'incremento della locazione di memoria.
Come disabilitare la cache della CPU ?
E` possibile disabilitare la cache della CPU con le seguenti istruzioni:
MOV EAX,CR0
OR EAX, 40000000h
MOV CR0,EAX
Visto che accedere al registro CR0 e` considerata un'operazione privilegiata,
il codice non funzionera` sotto windows/linux o altro emulatore.
[DOS] Come scrivere un programma TSR ?
I programmi TSR normalmente sono di 2 tipi: quelli che operano in
background, e quelli che vengono attivati tramite una combinazione di
tasti (o anche dopo un certo tempo). Prima di tutto bisogna sapere
che i programmi TSR hanno diverse limitazioni, che normalmente sono quelle
di non poter utilizzare molti dei servizi DOS/BIOS. A tutto c'e` pero` un
rimedio, in particolare le versioni dos abbastanza recenti (dalla 5.0)
hanno un flag chiamato InDos, che indica quando un programma TSR
puo` eseguire procedure DOS. Percio` quando e` necessario un servizio DOS
bisogna attendere che il flag sia azzerato, oppure il blocco del computer
e` assicurato. Percio` il tipico schema di funzionamento di un TSR e`
il seguente:
Cattura IRQ 0 [timer] (interrupt 8 o 1Ch) e IRQ 1 [tastiera] (interrupt 9)
La procedura che gestisce l'IRQ 1 serve per attivare il TSR quando viene
premuta una certa sequenza di tasti. Il TSR potrebbe venire attivato anche
in un'altra maniera, in ogni caso non bisogna eseguire subito il codice
del TSR, ma solo impostare un flag.
La procedura che gestisce l'IRQ 0 viene chiamata periodicamente, e
deve controllare che il flag del punto precednete sia a 1, e che il
flag InDOS sia a 0. In questo caso puo` essere richiamato il TSR.
Quando il TSR termina, deve ripristinare i vettori di interrupt che
ha modificato.
L'indirizzo del flag InDOS si ricava con la funzione 34H del DOS, che
restituisce in ES:BX l'indirizzo del byte. Oltre a questo byte bisogna
controllare anche quello con indirizzo ES:[BX-1]. Per maggiori
dettagli sulla funzione 34H guardate la
lista di Ralph Brown
[DOS] Cos'e` un dos extender ?
Un dos extender e` un programma che permette ad altri programmi di utilizzare il modo protetto sotto
dos (e tutti
gli emulatori dos). Alcuni esempi di dos extender sono il file dos4gw.exe presente in molti giochi, e csdpmi.exe
presente nel compilatore DJGPP e in quake. Il dos extender permette alle applicazioni di utilizzare il modo protetto
in modo standard, cioe` senza compromettere il DOS, percio` gli ultimi programmi per dos sfruttano quasi tutti un DE,
visto che in questo modo possono funzionare anche sotto emulatori dos, come windows 95/NT e Linux. Se i programmi
utilizzassero il modo protetto senza il DPMI (come succedeva anni fa) non si potrebbe utilizzare il programma con un
emulatore dos. Una precisazione: il dos extender e` il programma (dos4gw o altro) mentre DPMI e` il nome con cui si
indicano le chiamate offerte dal DE che effetuano i programmi, che sono accessibili tramite l'istruzione INT 31h. Nella
sezione download potete scaricare il documento se vi interessa.