Assembler

Voglio iniziare a programmare in assembler !
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:
  1. Cattura IRQ 0 [timer] (interrupt 8 o 1Ch) e IRQ 1 [tastiera] (interrupt 9)
  2. 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.
  3. 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.
  4. 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.