Capitolo – 6
Introduzione alle basi del computer
Introduzione
A volte, in alcuni casi, quando si tenta di recuperare dati o di eseguire qualsiasi attività di risoluzione dei problemi relativi a dati e disco (o qualsiasi altra attività correlata al sistema), è molto comodo utilizzare il comando DEBUG DOC.
È anche possibile che in alcuni casi particolari risulti più facile eseguire questa particolare operazione utilizzando DEBUG anziché programmare. Vediamo un esempio. Il seguente codice di debug sarà sufficiente per creare un backup DBR. Basta inserire le seguenti righe:
DEBUGGING BKDBR.BIN
L100 2 0 1
R SH
200
IN
IN
Qui puoi vedere che semplicemente digitando poche righe qui sopra puoi evitare di scrivere un programma. Diamo un'occhiata a un altro esempio di codifica che carica un backup DBR su disco
Ricordatelo sempre! Non tentare di farlo senza una conoscenza approfondita. Sii sicuro di ciò che farai. Un uso improprio delle seguenti istruzioni potrebbe causare una perdita importante di dati, poiché un uso non corretto delle istruzioni potrebbe rendere inaccessibili tutte le informazioni presenti sul disco.
DEBUGGING BKDBR.BIN
Nel 100 2 0 1
IN
Dopo aver visto il codice di questo esempio, puoi facilmente intuire quanto può aiutarti quando ne hai più bisogno. Inoltre, è impossibile programmare in ogni situazione. Tuttavia, nei casi di problemi semplici, per utilizzare le istruzioni di compilazione è sufficiente copiare debug.exe/debug.com sul disco di avvio e iniziare a scrivere il codice.
Le funzionalità e gli esempi descritti in questo capitolo e in questo libro sono compatibili solo con l'architettura della famiglia di processori Intel x86.
Innanzitutto, dobbiamo conoscere un po' le basi dell'architettura dei computer, in modo da poter comprendere i termini utilizzati nelle sezioni seguenti quando descriviamo il funzionamento e gli esempi nelle diverse fasi. Impariamo alcune nozioni fondamentali sull'architettura dei computer:
Concetti di base
processore
Questa parte è nota anche come unità centrale di elaborazione o CPU, che a sua volta è composta da un'unità di controllo e da un'unità aritmetico-logica. Le sue funzioni includono la lettura e la scrittura del contenuto delle celle di memoria, il trasferimento di dati tra celle di memoria e registri speciali e la decodifica e l'esecuzione di istruzioni di programma. Il processore è dotato di numerose celle di memoria che vengono utilizzate molto frequentemente e che quindi fanno parte della CPU.
Queste celle sono note come registri. Un processore può avere una o due dozzine di tali registri. L'unità logica aritmetica della CPU implementa operazioni relative a calcoli numerici e simbolici.
In genere questi dispositivi sono in grado di eseguire solo operazioni molto basilari, come l'addizione e la sottrazione di due numeri interi, la moltiplicazione e la divisione di numeri interi, la manipolazione di bit di registro e il confronto del contenuto di due registri. I personal computer possono essere classificati in base alla cosiddetta dimensione della parola, ovvero il numero di bit che il processore può elaborare contemporaneamente.
Memoria centrale
Si tratta di un gruppo di celle realizzate con semiconduttori, utilizzate per processi comuni come l'esecuzione di programmi e l'archiviazione di informazioni per le operazioni. Ognuna di queste celle può contenere un valore numerico e hanno la proprietà di essere direzionali. Ecco perché possono differenziarsi l'una dall'altra utilizzando un numero o un indirizzo univoco per ogni cella. Il nome generico di questi dispositivi di archiviazione è memoria ad accesso casuale o RAM.
Lo svantaggio principale di questo tipo di memoria è che i circuiti integrati perdono le informazioni memorizzate quando l'alimentazione viene interrotta. Ciò ha portato alla creazione della memoria, le cui informazioni non vengono perse quando il sistema viene spento. Questa memoria è chiamata Read Only Memory o ROM.
Affinché un computer possa elaborare le informazioni, è necessario che queste siano memorizzate in celle speciali chiamate registri. I registri sono gruppi di 8 o 16 flip-flop.
Un flip-flop è un dispositivo in grado di immagazzinare due livelli di tensione, uno basso, normalmente 0,5 volt, e un altro, comunemente 5 volt. Il livello basso di energia nel flip-flop è interpretato come spento o 0, e il livello alto come acceso o
- Questi stati sono solitamente noti come bit, che sono la più piccola unità di informazione in un computer.
Un gruppo di 16 bit è detto parola; una parola può essere divisa in gruppi di 8 bit detti byte, mentre i gruppi di 4 bit sono detti nibble.
Registri CPU
La CPU ha 4 registri interni, ognuno di 16 bit. I primi quattro, AX, BX, CX e DX sono registri di uso generale e possono anche essere usati come registri a 8 bit, se usati in tal modo è necessario fare riferimento ad essi ad esempio come: AH e AL, che sono i byte alti e bassi del registro AX. Questa nomenclatura è applicabile anche ai registri BX, CX e DX.
I registri conosciuti con i loro nomi specifici:
Registro |
Nome specifico |
ASCIA |
Accumulatore |
BxB |
Registro di base |
C.C.E. |
Registro di conteggio |
DX |
Registro dati |
S.S. |
Registro dei segmenti di dati |
È |
Registro di segmento extra |
SS |
Registro dei segmenti della batteria |
Servizio clienti |
Registro del segmento di codice |
BP |
Registro dei puntatori di base |
E |
Registro indice sorgente |
DI |
Registro indice di destinazione |
SP |
Registro puntatore batteria |
Proprietà intellettuale |
Registro puntatore istruzione successiva |
F |
Registro delle bandiere |
Tuttavia, nei prossimi capitoli utilizzeremo in dettaglio questi registri nella programmazione degli interrupt tramite C, ma imparare le basi del linguaggio assembly in questa sede sarà una buona idea e ci aiuterà nella programmazione delle operazioni su disco, ecc.
È possibile visualizzare i valori dei registri interni della CPU utilizzando il programma Debug. Per iniziare a lavorare con Debug, digitare il seguente prompt nel computer:
C:/>Debug <Invio>
Nella riga successiva apparirà un trattino, questo è l'indicatore di Debug, in questo momento le Istruzioni di Debug possono essere introdotte utilizzando il seguente comando:
- r <Invio>
Vengono visualizzati tutti i contenuti dei registri interni della CPU. Un'alternativa alla loro visualizzazione è usare il comando "r" usando come parametro il nome del registro di cui si desidera vedere il valore. Ad esempio:
-rbx <Invio>
Questa istruzione visualizzerà solo il contenuto del registro BX e l'indicatore Debug cambierà da "-" a ":"
Quando il prompt è come questo, è possibile modificare il valore del registro visualizzato digitando il nuovo valore e <Invio>, oppure è possibile lasciare il vecchio valore premendo Invio senza digitare nessun altro valore.
È possibile modificare il valore del registro flag e utilizzarlo come struttura di controllo nei nostri programmi, come vedremo più avanti. Ogni bit del registro ha un nome e un significato speciale, l'elenco seguente descrive il valore di ogni bit, acceso o spento, e la sua relazione con le operazioni del processore:
Traboccare
NV = non c'è overflow
OV = c'è un overflow
Direzione
SU = avanti
DN = all'indietro
Interruzioni
DI = disattivato
EI = attivato
Cartello
PL = positivo
NG = negativo
Zero
NZ = non è zero
ZR = è zero
Trasporto ausiliario
NA = non c'è alcun trasporto ausiliario
AC = c'è trasporto ausiliario
Parità
PO = parità non uniforme
PE = parità pari
Trasportare
NC = non c'è riporto
CY = c'è riporto
Struttura dell'assemblatore
Nel linguaggio assembly le linee di codice hanno due parti, la prima è il nome dell'istruzione che deve essere eseguita, e la seconda sono i parametri del comando. Ad esempio:
AGGIUNGI ah, bh
Qui "ADD" è il comando da eseguire; in questo caso un'addizione, mentre "ah" e "bh" sono i parametri.
Il nome delle Istruzioni in linguaggio è composto da due, tre o quattro lettere. Queste Istruzioni sono anche chiamate nomi mnemonici o codici operativi, poiché rappresentano una funzione che il processore eseguirà. Ci sono alcuni comandi che non richiedono parametri per il loro funzionamento, così come altri che richiedono solo un parametro.
Talvolta le istruzioni vengono utilizzate come segue:
AGGIUNGERE al,[170]
Le parentesi nel secondo parametro ci indicano che lavoreremo con il contenuto della cella di memoria numero 170 e non con il valore 170; questo è noto come direzione diretta.
Ora siamo pronti a scrivere il codice per il nostro primo programma con l'aiuto del debug. Creeremo un programma che funziona per illustrare ciò che abbiamo visto, e ciò che faremo è aggiungere due valori che introdurremo direttamente nel programma.
Il primo passo è avviare il Debug; questo passaggio consiste semplicemente nel digitare debug <Invio> sul prompt del sistema operativo.
Per assemblare un programma sul Debug, si usa il comando "a" (assemble). Quando si usa questo comando, l'indirizzo in cui si desidera che inizi l'assemblaggio può essere dato come parametro, se il parametro viene omesso l'assemblaggio verrà avviato nella località specificata da CS:IP, solitamente 0100h, che è la località in cui devono essere avviati i programmi con estensione .COM. E sarà il posto che useremo poiché solo Debug può creare questo tipo specifico di programmi.
Anche se in questo momento non è necessario assegnare un parametro al comando "a", è consigliabile farlo per evitare problemi una volta utilizzati i registri CS:IP, quindi digitiamo:
-a0100 <Invio>
Fatto questo apparirà sullo schermo qualcosa del genere: 0C1B:0100 e il cursore è posizionato a destra di questi numeri, nota che le prime quattro cifre, nel sistema esadecimale, possono essere diverse, ma le ultime quattro devono essere 0100, poiché è l'indirizzo che abbiamo indicato come inizio. Ora possiamo introdurre le Istruzioni:
0C1B:0100 mov ax,0002; mette il valore 0002 sul registro ax
0C1B:0103 mov bx,0004; mette il valore 0004 sul registro bx
0C1B:0106 aggiungi ax,bx; il contenuto di bx viene aggiunto al contenuto di ax
0C1B:0108 int 20; provoca la terminazione del programma.
0C1B:010A
Non è necessario scrivere i commenti che seguono il ";". Una volta digitato l'ultimo comando, int 20, si preme <Invio> senza scrivere altro, per visualizzare nuovamente il prompt del Debugger.
L'ultima riga scritta non è propriamente un'istruzione assembler, ma piuttosto una richiesta di interruzione del sistema operativo. Queste interruzioni ci fanno risparmiare un sacco di righe e sono molto utili per accedere alle funzioni del sistema operativo.
Per eseguire il programma che abbiamo scritto, viene utilizzato il comando "g" e quando utilizzato vedremo un messaggio che dice:
"Programma terminato normalmente". Naturalmente con un messaggio come questo non possiamo essere sicuri che il programma abbia fatto l'addizione, ma c'è un modo semplice per verificarlo, utilizzando il comando "r" del Debug possiamo vedere il contenuto di tutti i registri del processore, basta digitare:
-r <Invio>
Ogni registro con il suo rispettivo valore effettivo apparirà sullo schermo in questo modo:
AX=0006 BX=0004 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0C1B ES=0C1B SS=0C1B CS=0C1B IP=010A NV UP EI PL NZ NA PO NC
0C1B:010A DI DB
Esiste la possibilità che i registri contengano valori diversi, ma AX e BX devono essere uguali, poiché sono quelli che abbiamo appena modificato.
Un altro modo per visualizzare i valori, mentre il programma è in esecuzione, è quello di utilizzare l'indirizzo in cui vogliamo che termini l'esecuzione e mostrare i valori dei registri come parametro per "g", in questo caso sarebbe: g108, questa istruzione esegue il programma, si ferma all'indirizzo 108 e mostra il contenuto dei registri.
Un controllo di ciò che accade nei registri può essere effettuato tramite il comando "t" (traccia); la funzione di questo comando è quella di eseguire riga per riga quanto assemblato, mostrando ogni volta il contenuto dei registri.
Per uscire da Debug utilizzare il comando "q" (quit).
Vantaggi dell'assemblatore
Il primo motivo per cui dovresti lavorare con l'assembler è che offre la possibilità di conoscere meglio il funzionamento del tuo PC, il che consente di sviluppare software in modo più coerente.
Il secondo motivo è il controllo totale del computer, che puoi avere con l'uso dell'assembler. Un altro motivo è che i programmi basati sull'assembly sono più rapidi e in alcuni casi sono più piccoli e hanno capacità maggiori rispetto a quelli creati con altri linguaggi.
Lasciatemi mantenere la mia promessa!!
Nella prima parte di questo capitolo abbiamo utilizzato alcune istruzioni come esempio, per effettuare il backup di DBR e per caricare il backup di DBR nella sua posizione originale quando necessario. Per prima cosa esaminiamo l'istruzione per effettuare il backup.
C:\>DEBUG A:\BKDBR.BIN <Invio>
File non trovato
- L 100 2 0 1 < Invio>
- R CX < Invio>
CX 0000
: 200 < Invio>
- W < Invio>
Scrittura di 00200 byte
- Q < Invio>
In questo esempio iniziamo a studiare dalla prima riga. Il comando DEBUG A:\BKDBR.BIN Inizializza il comando di debug con la creazione di un file nell'unità floppy A: denominato BKDBR.BIN se non è già presente lì. Ecco perché abbiamo ricevuto il messaggio "File non trovato" all'inizio.
Nella nostra seconda istruzione L 100 2 0 1, il comando L (load) serve a caricare il DBR dell'unità istruita. Impariamo come? In questa istruzione il numero 100 è l'indirizzo del buffer, dove verrà memorizzato il DBR, il numero successivo 2 è utilizzato per l'unità C(C :). I numeri delle unità sono forniti come segue:
Lettera di unità |
Numero utilizzato |
UN: |
0 |
B: |
1 |
C: |
2 |
D: |
3 |
. |
. |
. |
. |
e così via |
. |
Il numero successivo 0 è il numero di settore iniziale del numero di settori da leggere. Qui stiamo usando 0 per leggere il 1° settore, ovvero il settore DBR. Il numero successivo, che è 1, è usato per informare il numero di settori da leggere.
Qui abbiamo dato 1 perché vogliamo leggere solo un settore. Tuttavia possiamo usare i numeri e le posizioni dei settori di inizio e fine in base alle nostre esigenze in diversi tipi di altre operazioni. Pertanto caricherà un settore a partire dal 1° settore dell'unità C: fino alla posizione di memoria 100.
E l'istruzione R CX viene utilizzata per modificare o definire la lunghezza dei dati che vogliamo scrivere nel file BKDBR.BIN. Questa istruzione mostrerà il valore corrente del registro CX e ti consentirà di apportare qualsiasi modifica. Abbiamo digitato 200 qui perché il comando DEBUG utilizza il sistema esadecimale e la dimensione di DBR in esadecimale è 200(h) byte, ovvero 512 byte nel sistema decimale.
Il comando W dice al DEBUG di scrivere i 200(h) byte dalla posizione 100 al file BKDBR.BIN. E infine usiamo l'istruzione Q per uscire dal DEBUG e tornare al prompt DOS.
Attenzione!!! Attenzione!!! Attenzione!!!
Si raccomanda vivamente di sapere cosa e come si sta facendo nella procedura di ripristino del DBR di qualsiasi disco. Se accidentalmente si archivia il DBR illegale o di qualsiasi altro disco, è possibile nella maggior parte dei casi che i dati completi del disco possano diventare inaccessibili.
quando digiti la prima istruzione della codifica che è:
DEBUG A:\BKDBR.BIN <Invio>
Il file deve trovarsi nella posizione indicata in cui si sta avviando il programma DEBUG. Ora, se si riceve il messaggio di errore "File non trovato" prima del prompt DEBUG, interrompere immediatamente il processo utilizzando il comando Q (quit). Perché significa che il file BKDBR.BIN non è stato trovato o aperto dal programma DEBUG e se si continua questo processo, alcune informazioni spazzatura verranno scritte su DBR e renderanno l'intera partizione inaccessibile. |
Ora vediamo cosa abbiamo fatto nella codifica delle Istruzioni per il ripristino del DBR dal file di backup che abbiamo creato denominato BKDBR.BIN. I comandi di DEBUG per ripristinare il backup sono i seguenti:
C:\> DEBUG A:\BKDBR.BIN <Invio>
- W 100 2 0 1 < Invio>
- Q < Invio >
|
Questa istruzione scriverà 1 settore di informazioni dal file BKDBR.BIN nell'unità floppy (a:) nella posizione di memoria 100 nel primo settore, ovvero il settore 0 della seconda unità, ovvero l'unità (C:).
Memorizzazione e caricamento dei programmi
Non sembrerebbe pratico dover digitare un programma intero ogni volta che serve, e per evitarlo è possibile memorizzare un programma su disco, con l'enorme vantaggio che essendo già assemblato non sarà necessario eseguire nuovamente Debug per eseguirlo.
I passaggi per salvare un programma già memorizzato nella memoria sono:
- Ottenere la lunghezza del programma sottraendo l'indirizzo finale da quello iniziale, naturalmente nel sistema esadecimale.
- Assegna un nome e un'estensione al programma.
- Inserire la lunghezza del programma nel registro CX.
- Ordina a Debug di scrivere il programma sul disco.
Utilizzando il seguente programma come esempio, avremo un'idea più chiara di come fare questi passaggi. Quando il programma sarà finalmente assemblato, apparirà così:
0C1B:0100 movimento ascia,0002
0C1B:0103 movimento bx,0004
0C1B:0106 aggiungi ax,bx
0C1B:0108 hai 20 anni
0C1B:010A
-ore 10a 100
020a 000a
-n test.com
-rcx
Codice CX0000
:000a
-In
Scrittura di 000A byte
Per ottenere la lunghezza di un programma si usa il comando "h", che ci mostrerà l'addizione e la sottrazione di due numeri in esadecimale. Per ottenere la lunghezza del nostro, diamo come parametri il valore dell'indirizzo finale del nostro programma (10A) e l'indirizzo iniziale del programma (100). Il primo risultato che ci mostra il comando è l'addizione dei parametri e il secondo è la sottrazione.
Il comando "n" ci consente di dare un nome al programma. Il comando "rcx" ci consente di modificare il contenuto del registro CX al valore che abbiamo ottenuto dalla dimensione del file con "h", in questo caso 000a, poiché il risultato della sottrazione dell'indirizzo finale dall'indirizzo iniziale.
Infine, il comando "w" scrive il nostro programma sul disco, indicando quanti byte ha scritto. Inoltre, per salvare un file già caricato sono necessari due passaggi:
- Specifica il nome del file da caricare.
- Caricarlo utilizzando il comando "l" (load).
Per ottenere il risultato corretto dei passaggi successivi, è necessario che il programma sopra indicato sia già stato creato.
All'interno di Debug scriviamo quanto segue:
-n test.com
-l
-nel 100 109
0C3D:0100 B80200 MOV AX,0002
0C3D:0103 BB0400 MOV BX,0004
0C3D:0106 01D8 AGGIUNGI AX,BX
0C3D:0108 CD20 INT 20
L'ultimo comando "u" serve a verificare che il programma sia stato caricato in memoria. Ciò che fa è disassemblare il codice e mostrarlo disassemblato. I parametri indicano da dove effettuare il DEBUG e dove effettuare il disassemblaggio. DEBUG carica sempre i programmi in memoria all'indirizzo 100H, altrimenti indicato.
Segmenti
L'architettura dei processori x86 obbliga all'utilizzo di segmenti di memoria per gestire le informazioni, la dimensione di questi segmenti è di 64 kb.
La ragione di essere di questi segmenti è che, considerando che la dimensione massima di un numero che il processore può gestire è data da una parola di 16 bit o registro, non sarebbe possibile accedere a più di 65536 località di memoria utilizzando solo uno di questi registri, ma ora, se la memoria è divisa in gruppi o segmenti, ognuno di 65536 località, e utilizziamo un indirizzo su un registro esclusivo per trovare ogni segmento, e quindi rendiamo ogni indirizzo di uno slot specifico con due registri, ed è possibile per noi accedere a una quantità di 4294967296 byte di memoria.
Affinché l'assemblatore possa gestire i dati, è necessario che ogni informazione o istruzione si trovi nell'area corrispondente ai rispettivi segmenti. L'assemblatore accede a queste informazioni tenendo conto della localizzazione del segmento, data dai registri DS, ES, SS e CS e all'interno del registro l'indirizzo dell'informazione specificata. È per questo che quando creiamo un programma utilizzando il Debug su ogni riga che assembliamo, appare qualcosa del genere:
1CB0:0102 MOV AX,BX
Dove il primo numero, 1CB0, corrisponde al segmento di memoria utilizzato, il secondo si riferisce all'indirizzo all'interno di questo segmento e seguono le istruzioni che verranno memorizzate da quell'indirizzo.
L'assembler regola la dimensione dei segmenti prendendo come base il numero di byte di cui ogni istruzione assemblata necessita, poiché sarebbe uno spreco di memoria utilizzare tutti i segmenti. Ad esempio, se un programma necessita solo di 10 kb per memorizzare i dati, il segmento dati sarà solo di 10 kb e non dei 64 kb che può gestire.
Spostamento dei dati
Per vostra conoscenza e comodità elenco qui alcune istruzioni in linguaggio assembly per le operazioni sui dati; quando programmeremo con l'aiuto di interrupt e altre operazioni BIOS avremo bisogno delle sue basi.
L'introduzione dettagliata e lo studio approfondito del linguaggio assembly vanno oltre i limiti di questo libro. Sebbene la conoscenza delle basi dell'assembly sia necessaria per procedere nei capitoli di programmazione più importanti, se ritieni che sia difficile comprendere tutte le istruzioni, non devi preoccuparti, ma è consigliabile acquisire l'idea di base delle istruzioni.
In qualsiasi programma è necessario spostare i dati nella memoria e nei registri della CPU e ci sono diversi modi per farlo. È possibile copiare i dati nella memoria in un registro, da un registro a un registro, da un registro a uno stack, da uno stack a un registro, trasmettere dati a dispositivi esterni e viceversa.
Questo movimento di dati è soggetto a regole e restrizioni. Eccone alcune:
- Non è possibile spostare i dati da una posizione di memoria a un'altra direttamente. È necessario prima spostare i dati della posizione di origine in un registro e poi dal registro alla località di destinazione.
- Non è possibile spostare una costante direttamente in un registro di segmento; è prima necessario spostarla in un registro nella CPU.
- È possibile spostare blocchi di dati tramite le istruzioni MOVS, che copiano una catena di byte o parole. MOCSB che copia n byte da una posizione all'altra e MOVSW copia n parole da una posizione all'altra. Le ultime due istruzioni prendono i valori dagli indirizzi definiti da DS:SI come gruppo di dati da spostare e ES:DI come nuova localizzazione dei dati.
Per spostare i dati ci sono anche strutture chiamate batterie, dove i dati vengono introdotti con l'istruzione push e vengono estratti con l'istruzione pop. In una pila il primo dato ad essere introdotto è l'ultimo che possiamo prendere, cioè se nel nostro programma utilizziamo queste istruzioni:
SPINGERE L'ASCIA
SPINGERE BX
SPINGERE CX
Per restituire i valori corretti a ciascun registro al momento di prelevarli dallo stack è necessario procedere nel seguente ordine:
Il POP CX
POP-BX-Italiano
ASCIA POP
Per la comunicazione con dispositivi esterni, il comando out viene utilizzato per inviare informazioni a una porta e il comando in per leggere le informazioni ricevute da una porta.
La sintassi del comando OUT è:
FUORI DX,AX
Dove DX contiene il valore della porta che verrà utilizzata per la comunicazione e AX contiene le informazioni che verranno inviate.
La sintassi del comando IN è:
IN ASSE,DX
Dove AX è il registro in cui verranno conservate le informazioni in arrivo e DX contiene l'indirizzo della porta tramite la quale arriveranno le informazioni.
Istruzioni MOV
Utilizzato per il trasferimento dati tra celle di memoria, registri e accumulatore. La sintassi è la seguente:
Destinazione MOV, Sorgente
I diversi movimenti di dati consentiti per questa Istruzione sono riportati nella tabella seguente:
Numero S. |
Destinazione |
Fonte |
1. |
memoria |
accumulatore |
2. |
accumulatore |
memoria |
3. |
registro di segmento |
memoria/registro |
4 |
memoria/registro |
registro di segmento |
5. |
Registro |
registro |
6. |
Registro |
memoria |
7. |
memoria |
registro |
8. |
Registro |
dati immediati |
9. |
memoria |
dati immediati |
Vediamo un esempio:
MOV AX,0006
Movimento BX,AX
MOVIMENTO ASSE,4C00
INTERNO 21
Questo programma sposta il valore di 0006H nel registro AX, quindi sposta il contenuto di AX (0006h) nel registro BX e infine sposta il valore 4C00h nel registro AX per terminare l'esecuzione con l'opzione 4C dell'interruzione 21h. Faremo una breve introduzione all'interruzione 13H e all'interruzione 21H più avanti.
Interruzioni
Un interrupt è una funzione hardware che fa sì che la CPU sospenda l'esecuzione, salvi il suo stato e trasferisca in una posizione specifica. La posizione di trasferimento specifica l'indirizzo di un programma che intende intraprendere un'azione in risposta all'interrupt. Il programma che viene eseguito come risultato dell'interrupt è chiamato programma di gestione degli interrupt.
Ad esempio: se DOS vuole inviare alcune informazioni al BIOS o BIOS vuole inviare alcune informazioni al sistema informatico, DOS o BIOS generano interrupt. Ogni volta che viene generato un interrupt, il computer sospende qualsiasi cosa stia facendo e prima si occupa dell'operazione che ha generato l'interrupt.
A ogni dispositivo in grado di generare interrupt viene assegnato un numero di interrupt univoco per identificare quale dispositivo sta generando questi interrupt. Discuteremo tutte le funzioni e sottofunzioni dell'interrupt 13H, delle estensioni dell'interrupt 13H e dell'interrupt 21H in questo libro.
Fondamentalmente, le interruzioni possono essere di tre tipi:
- Interruzioni hardware interne
- Interruzioni hardware esterne
- Interruzioni del software
Interruzioni hardware interne
Le interruzioni interne sono generate da determinati eventi che si verificano durante l'esecuzione di un programma. Questo tipo di interruzioni è gestito nella sua totalità dall'hardware e non è possibile modificarle.
Un chiaro esempio di questo tipo di interruzioni è quella che attualizza il contatore dell'orologio interno del computer: l'hardware richiama questa interruzione più volte al secondo per mantenere l'ora aggiornata.
Sebbene non possiamo gestire direttamente questa interruzione, poiché non possiamo controllare l'aggiornamento dell'ora tramite software, è tuttavia possibile utilizzare i suoi effetti sul computer a nostro vantaggio.
Ad esempio: per creare un orologio virtuale aggiornato costantemente dobbiamo solo scrivere un programma che legga il valore effettivo del contatore e lo traduca in un formato comprensibile per l'utente.
Interruzioni hardware esterne
Le interruzioni esterne sono generate da dispositivi periferici, come tastiere, stampanti, schede di comunicazione, ecc. Sono generate anche da coprocessori. Non è possibile disattivare le interruzioni esterne.
Queste interruzioni non vengono inviate direttamente alla CPU ma vengono inviate ad un circuito integrato la cui funzione è quella di gestire esclusivamente questo tipo di interruzioni
Interruzioni del software
Le interruzioni software possono essere attivate direttamente dall'assembler richiamando il numero dell'interruzione desiderata con l'istruzione INT.
L'uso delle interruzioni ci aiuta nella creazione di programmi e usandole i nostri programmi diventano più corti. Sono più facili da capire e solitamente hanno una migliore performance soprattutto grazie alle loro dimensioni più piccole. Questo tipo di interruzioni può essere separato in due categorie: le interruzioni del sistema operativo DOS e le interruzioni del BIOS.
La differenza tra i due è che le interruzioni del sistema operativo sono più facili da usare ma sono anche più lente poiché queste interruzioni sfruttano il BIOS per raggiungere il loro scopo, d'altro canto le interruzioni del BIOS sono molto più veloci ma hanno lo svantaggio che, essendo parte dell'hardware, sono molto specifiche e possono variare anche a seconda della marca del produttore del circuito.
La scelta del tipo di interruzione da utilizzare dipenderà esclusivamente dalle caratteristiche che si desidera conferire al programma.
Poiché utilizzeremo gli interrupt per la programmazione del recupero dati con l'aiuto del linguaggio C tramite la gestione degli interrupt con C, discuteremo solo di Interrupt 13H, Interrupt 13H Extensions e Interrupt 21H routine in modo specifico. Non è così importante discutere di tutti gli altri interrupt e delle loro funzioni perché nel linguaggio C sono disponibili funzioni più semplici per eseguire la maggior parte di queste attività. Tuttavia, la conoscenza di Interrupt 13H e delle sue estensioni è obbligatoria per la programmazione del recupero dati. |
Facciamo una breve introduzione di Interrupt 20H e Interrupt 21H. Il valore scritto tra parentesi (come 0x20) indica come utilizzare
INT 20H (0x20) --> Termina processo
Chiama con: CS = indirizzo del segmento del prefisso del segmento del programma
Restituisce: Niente
Commenti:
Termina il processo corrente. Questo è uno dei vari metodi che un programma può usare per eseguire un'uscita finale. Puoi anche usare funzioni (00H o 31H o 4CH) di INT 21H o semplicemente INT 27H per eseguire un'uscita finale dove le funzioni 31H e 4CH di INT 21H sono generalmente preferite perché consentono di passare un codice di ritorno al processo padre.
Se hai utilizzato File Control Blocks (FCB) per scrivere un file, ti consigliamo di chiudere prima il file, altrimenti potresti perdere i dati perché nell'azione di uscita finale tutta la memoria occupata dal processo viene rilasciata, i buffer dei file vengono svuotati e tutti gli handle aperti per i file o i dispositivi di proprietà del processo vengono chiusi.
Pertanto, se sono presenti handle aperti per un file, i dati potrebbero andare persi.
INTERNO 21H (0x21)
Funzione 00H (0x00) --> Termina processo
Chiama con: AH = 00H
CS = indirizzo del segmento del prefisso del segmento del programma
Restituisce: Niente
Commenti:
Questa interruzione termina il processo corrente. Questo è uno dei vari metodi che un programma può usare per eseguire un'uscita finale. Per maggiori informazioni, vedere INT 20H
INTERNO 21H (0x21)
Funzione 01H (0x01) --> Input carattere con eco
Chiama con: AH = 01H
Restituisce: AL = dati di input a 8 bit
Commenti:
Questa interruzione legge un carattere dal dispositivo di input standard, come la tastiera, e lo echeggia sul dispositivo di output standard. Se non è pronto alcun carattere, attende finché non ne è disponibile uno.
INTERNO 21H (0x21)
Funzione 02H (0x02) --> Output carattere
Chiama con: AH = 02H
DL = dati a 8 bit per l'output
Restituisce: Niente
Commenti:
Invia un carattere al dispositivo di output standard. L'output può essere reindirizzato. Se l'output viene reindirizzato, non c'è modo di rilevare il disco pieno.
È anche possibile inviare stringhe al display eseguendo una scrittura (INT 21H, Funzione 40H) utilizzando l'handle predefinito per l'output standard (0001H), se l'output non è stato reindirizzato o un handle ha ottenuto il dispositivo logico CON.
INTERNO 21H (0x21)
Funzione 03H (0x03) --> Ingresso ausiliario
Chiama con: AH = 03H
Restituisce: AL = dati di input a 8 bit
Commenti:
Legge un carattere dal dispositivo ausiliario standard. Il valore predefinito è la prima porta seriale (COM1).
Se il dispositivo ausiliario invia dati più velocemente di quanto il programma possa elaborarli, i caratteri potrebbero andare persi. Non c'è modo per un programma utente di leggere lo stato del dispositivo ausiliario o di rilevare errori di I/O come caratteri persi, tramite questa chiamata di funzione.
INTERNO 21H (0x21)
Funzione 04H (0x04) --> Uscita ausiliaria
Chiama con: AH = 04H
DL = dati a 8 bit per l'output
Restituisce: Niente
Commenti:
Questa funzione di INT 21H invia un carattere al dispositivo ausiliario standard. Il valore predefinito è la prima porta seriale (COM1). Le stringhe possono anche essere inviate al dispositivo ausiliario eseguendo una scrittura (INT 21H Function 40H) utilizzando l'handle predefinito per il dispositivo ausiliario standard (00034) o utilizzando un handle ottenuto aprendo il dispositivo logico AUX.
INTERNO 21H (0x21)
Funzione 05H (0x05) --> Output stampante
Chiama con: AH = 05H
DL = dati a 8 bit per l'output
Restituisce: Niente
Commenti:
Questa funzione invia un carattere al dispositivo di elenco standard. Il dispositivo predefinito è la stampante sulla prima porta parallela (LPT1). Le stringhe possono anche essere inviate alla stampante eseguendo una scrittura (INT 21H Funzione 40H) utilizzando l'handle predefinito per il dispositivo di stampa standard (0004H) o utilizzando un handle ottenuto aprendo il dispositivo logico PRN o LPT1.
INTERNO 21H (0x21)
Funzione 06H (0x06) --> I/O console diretto
Chiama con: AH = 06H
DL = funzione richiesta tale che,
Se richiesta di output, 00H-FEH
Se richiesta di input, 0FFH
Restituisce: nulla, se chiamato con DL = 00H-0FEH
Se chiamato con DL = FFH e un carattere è pronto
Flag zero = chiaro
AL = dati di input a 8 bit
Se chiamato con DL = FFH e nessun carattere è pronto
Flag zero = impostato
Commenti:
Legge un carattere dal dispositivo di input standard o scrive un carattere sul dispositivo di output standard. L'I/O può essere reindirizzato, ma se l'I/O è stato reindirizzato, non c'è modo di rilevare EOF o disco pieno. Questa funzione di INT 21H è utilizzata dai programmi che hanno bisogno di leggere e scrivere tutti i caratteri possibili e i codici di controllo senza alcuna interferenza dal sistema operativo.
INTERNO 21H (0x21)
Funzione 07H (0x07) --> Input di caratteri non filtrati senza Echo
Chiama con: AH = 07H
Restituisce: AL = dati di input a 8 bit
Commenti:
Questa funzione legge un carattere dal dispositivo di input standard senza riprodurlo sul dispositivo di output standard.
INTERNO 21H (0x21)
Funzione 08H (0x08) --> Input di caratteri senza eco
Chiama con: AH = 08H
Restituisce: AL = dati di input a 8 bit
Commenti:
Questa funzione legge un carattere dal dispositivo di input standard senza riprodurlo sul dispositivo di output standard.
INTERNO 21H (0x21)
Funzione 09H (0x09) --> Visualizza stringa
Chiama con: AH = 09H
DS:DX = segmento: offset della stringa
Restituisce: Niente
Commenti:
Invia una stringa di caratteri al dispositivo di output standard. L'output può essere reindirizzato. Se l'output è stato reindirizzato, non c'è modo di rilevare il disco pieno. La stringa può anche essere inviata al display eseguendo una scrittura (INT 21H Funzione 40H) utilizzando l'handle predefinito per l'output standard (0001H), se non è stato reindirizzato, o un handle ottenuto aprendo il dispositivo logico CON.
INTERNO 21H (0x21)
Funzione 0AH (0x0A o 10) --> Input tastiera bufferizzato
Chiama con: AH = 0AH
DS:DX = segmento: offset del buffer
Restituisce: dati inseriti nel buffer, non restituisce nulla
Commenti:
Legge una stringa di byte dal dispositivo di input standard, fino a un ritorno a capo ASCII (0DH) incluso, e li inserisce in un buffer designato dall'utente. I caratteri vengono riprodotti sul dispositivo di output standard. Il buffer utilizzato dalla funzione ha il seguente formato:
Byte |
Contenuto |
0 |
Numero massimo di caratteri da leggere, impostato dal programma |
1 |
Numero di caratteri effettivamente letti (escluso il ritorno a capo), impostato da MS-DOS |
2+ |
Stringa letta dalla tastiera o dall'input standard, terminata da un ritorno a capo (0DH) |
INTERNO 21H (0x21)
Funzione 0BH (0x0B o 11) --> Controlla lo stato dell'input
Chiama con: AH = 0BH
Restituisce: AL = 00H (se non è disponibile alcun carattere)
FFH (se almeno un carattere è disponibile)
Commenti:
Controlla se un carattere è disponibile dal dispositivo di input standard, come la tastiera. Questa funzione è equivalente a IOCTL INT 21H Funzione 44H Sottofunzione 06H.
INTERNO 21H (0x21)
Funzione 0CH (0x0C o 12) --> Svuota buffer di input e quindi Input
Chiama con: AH = 0CH
AL = numero di input da richiamare dopo il ripristino
buffer (deve essere 01H, 06H, 07H, 08H o 0AH)
Se AL = 0AH
DS: DX = segmento: offset del buffer di input
Restituisce: se chiamato con AL = 01H, 06H, 07H o 08H,
AL = dati di input a 8 bit
Se chiamato con AL= 0AH,
Niente (dati inseriti nel buffer)
Commenti:
Cancella il buffer di input standard e quindi richiama una delle funzioni di input dei caratteri. L'input può essere reindirizzato. Un numero di funzione in AL eccetto 01H, 06H, 07H, 08H o 0AH svuota il buffer di input e restituisce il controllo al programma chiamante.
INTERNO 21H (0x21)
Funzione 0DH (0x0D o 13) -> Ripristino disco
Chiama con: AH = 0DH
Restituisce:Niente
Commenti:
Questa funzione svuota tutti i buffer dei file. La funzione non aggiorna la directory del disco per i file ancora aperti.
INTERNO 21H (0x21)
Funzione 0EH (0x0E o 14) -> Seleziona disco
Chiama con: AH = 0EH
DL = codice unità (0 = A, 1 = B, ecc.)
Restituisce: AL = numero di unità logiche nel sistema
Commenti:
Seleziona l'unità specificata come unità disco corrente o predefinita e restituisce il numero totale di unità logiche nel sistema.
Le applicazioni dovrebbero limitarsi alle lettere di unità AZ (0 = A, 1 = B, ecc.). Le unità logiche indicano il numero totale di dispositivi a blocchi come floppy disk e unità disco rigido, ecc. In genere, una singola unità disco rigido fisica è suddivisa in due o più unità logiche.
INTERNO 21H (0x21)
Funzione 0FH (0x0F o 15) -> Apri file
Chiama con: AH = 0FH
S: DX = segmento: offset del blocco di controllo del file
Restituisce: se la funzione ha esito positivo e il file è stato trovato
AL = 00H
E l'FCB compilato da MS-DOS è il seguente:
Campo di azionamento (offset 00H) = 1 per l'azionamento A, 2 per l'azionamento B, ecc. Campo di blocco corrente (offset 0CH) = 00H
Campo dimensione record (offset 0EH) = 0080H
Campo dimensione (offset 10H) = dimensione del file dalla directory
Campo dati (offset 14H) = timbro data dalla directory
Campo orario (offset 16H) = timestamp dalla directory
Se la funzione non riesce e il file non viene trovato
AL = 0FFH
Commenti:
Apre un file e lo rende disponibile per successive operazioni di lettura/scrittura. Se il programma utilizzerà una dimensione di record diversa da 128 byte, dovrebbe impostare il campo record-size su offset FCB 0EH dopo che il file è stato aperto correttamente e prima di qualsiasi altra operazione su disco.
INTERNO 21H (0x21)
Funzione 10H (0x10 o 16) -> Chiudi file
Chiama con: AH = 10H
DS: DX = segmento: offset del blocco di controllo del file
Restituisce: se la funzione ha esito positivo (aggiornamento della directory riuscito)
AL = 00H
Se la funzione non riesce (file non trovato nella directory)
AL = FFH
Commenti:
Viene utilizzato per chiudere un file. Chiude un file, svuota tutti i buffer interni del disco MS-DOS associati al file sul disco e aggiorna la directory del disco se il file è stato modificato o esteso.
INTERNO 21H (0x21)
Funzione 11H (0x11 o 17) -> Trova il primo file
Chiama con: AH = 11H
DS: DX = segmento: offset del blocco di controllo del file
Restituisce: se la funzione ha esito positivo e viene trovato il file corrispondente
AL = 00H
E il buffer all'indirizzo corrente dell'area di trasferimento del disco (DTA) viene compilato come un FCB normale non aperto o come un FCB esteso, a seconda del tipo di FCB immesso per funzionare.
Se la funzione non riesce (non è stato trovato alcun nome file corrispondente)
AL = FFH
Commenti:
Cerca nella directory corrente sul drive designato un nome file corrispondente. Puoi usare i caratteri jolly (? e *). Questa funzione restituisce il primo nome file corrispondente.
INTERNO 21H (0x21)
Funzione 12H (0x12 o 18) -> Trova il file successivo
Chiama con: AH = 12H
DS: DX = segmento: offset del blocco di controllo del file
Restituisce: se la funzione ha esito positivo e viene trovato il nome file corrispondente
AL = 00H
E il buffer all'indirizzo dell'area di trasferimento del disco (DTA) corrente è impostato come un FCB normale non aperto o un FCB esteso, a seconda del tipo di FCB originariamente immesso nella funzione INT21H 11H
Se la funzione non riesce e i nomi dei file corrispondenti non vengono trovati
AL = FFH
Commenti:
Questa è la compagna della funzione precedente. Se INT 21H Funzione 11H ha avuto successo, restituisce il nome file corrispondente successivo, se presente. Questa funzione presuppone che l'FCB utilizzato come input sia stato inizializzato correttamente da una precedente chiamata a INT 21H Funzione 11H e da possibili chiamate successive a INT 21H Funzione 12H e che il nome file o l'estensione ricercati contengano almeno un carattere jolly.
INTERNO 21H (0x21)
Funzione 13H (0x13 o 19) -> Elimina file
Chiama con: AH = 13H
DS: DX = segmento: offset del blocco di controllo del file
Restituisce: se la funzione ha esito positivo e il file o i file sono stati eliminati
AL = 00H
Se la funzione non riesce e non sono stati trovati file corrispondenti o almeno un file corrispondente era di sola lettura,
AL = FFH
Commenti:
Elimina tutti i file corrispondenti dalla directory corrente sul disco rigido predefinito o specificato. Puoi anche usare i caratteri jolly (? e *).
INTERNO 21H (0x21)
Funzione 14H (0x14 o 20) -> Lettura sequenziale
Chiama con: AH = 14H
DS: DX = segmento: offset del segmento aperto in precedenza
blocco di controllo file
Restituisce: AL = 00H se la lettura è riuscita
01H se fine del file
02H se il segmento si avvolge
03H se il record parziale è stato letto alla fine
file
Commenti:
Questa funzione legge il successivo blocco sequenziale di dati da un file, quindi incrementa il puntatore del file in modo appropriato. Il numero di byte di dati da leggere è specificato dal campo record-size (offset 0EH) del blocco di controllo file (FCB).
Il record viene letto in memoria all'indirizzo corrente dell'area di trasferimento del disco (DTA), specificato dalla chiamata più recente alla funzione INT 21H 1AH. Se la dimensione del record e la posizione del buffer sono tali che si verificherebbe un overflow o un wraparound del segmento, la funzione fallisce con un codice di ritorno di 02H.
INTERNO 21H (0x21)
Funzione 15H (0x15 o 21) --> Scrittura sequenziale
Chiama con: AH = 15H
DS: DX = segmento: offset del blocco di controllo del file aperto in precedenza
Restituisce: AL = 00H, se la scrittura è riuscita
01H, se il disco è un file
02H, se il segmento si avvolge
Commenti:
Questa funzione scrive il successivo blocco sequenziale di dati in un file, quindi incrementa il puntatore del file in modo appropriato. Il numero di byte di dati da scrivere è specificato dal campo dimensione record (offset 0EH) del blocco di controllo file (FCB).
INTERNO 21H (0x21)
Funzione 16H (0x16 o 22) --> Crea file
Chiama con: AH = 16H
DS: DX = segmento: offset del blocco di controllo del file non aperto
Restituisce: se la funzione ha esito positivo e il file è stato creato o troncato
AL = 00H
E FCB compilato da MS-DOS come segue:
Campo di azionamento (offset 00H) = 1 per l'azionamento A, 2 per l'azionamento B, ecc.
Campo blocco corrente (offset0CH) = 00H
Campo dimensione record (offset 0EH) = 0080H
Campo dimensione (offset 10H) = dimensione del file dalla directory
Campo data (offset 14H) = timbro data dalla directory
Campo orario (offset 16H = timestamp dalla directory
Se la funzione non riesce (directory piena)
AL = FFH
Commenti:
Questa funzione crea una nuova voce di directory nella directory corrente o tronca qualsiasi file esistente con lo stesso nome a lunghezza zero. Apre inoltre il file per successive operazioni di lettura/scrittura. Questa funzione deve essere utilizzata con cautela perché un file esistente con il nome specificato viene troncato a lunghezza zero e tutti i dati in quel file vengono irrimediabilmente persi.
INTERNO 21H (0x21)
Funzione 17H (0x17 o 23) --> Rinomina file
Chiama con: AH = 17H
DS: DX = segmento: offset del blocco di controllo del file speciale
Restituisce: se la funzione ha esito positivo e uno o più file sono stati rinominati
AL = 00H
Se la funzione non riesce e non ci sono file corrispondenti o il nuovo nome file corrisponde a un file esistente
AL = FFH
Commenti:
Questa funzione modifica il nome di tutti i file corrispondenti nella directory corrente del disco nell'unità specificata.
Puoi anche usare i caratteri jolly con questo. Il blocco di controllo file speciale ha un codice unità, nome file ed estensione nella posizione usuale (byte da 0 a 0BH) e un secondo nome file che inizia 6 byte dopo il primo (offset 11H).
INT 21H
Funzione 18H (0x18 o 24) --> Riservato
INTERNO 21H (0x21)
Funzione 19H (0x19 o 25) --> Ottieni il disco corrente
Chiama con: AH = 19H
Restituisce: AL = codice unità (0 per unità A, 1 per unità B ecc.)
Commenti:
Questa funzione restituisce il codice dell'unità disco corrente o predefinita.
INTERNO 21H (0x21)
Funzione 1AH (0x1A o 26) --> Imposta indirizzo DTA
Chiama con: AH = 1AH
DS: DX = segmento: offset dell'area di trasferimento del disco.
Restituisce: Niente
Commenti:
Questa funzione specifica l'indirizzo dell'area di trasferimento del disco (DTA) da utilizzare per le successive chiamate di funzione correlate a FCB.
INTERNO 21H (0x21)
Funzione 1BH (0x1B o 27) --> Ottieni i dati dell'unità predefinita
Chiama con: AH = 1BH
Restituisce: se la funzione ha successo
AL = settori per cluster
DS: DX = offset del segmento del byte dell'ID del supporto
CX = dimensione del settore fisico in byte
DX = numero di cluster per l'unità predefinita
Se la funzione non riesce (unità non valida o errore critico)
AL = FFH
Commenti:
Questa funzione ottiene informazioni selezionate sull'unità disco predefinita e un puntatore al byte di identificazione del supporto dalla sua tabella di allocazione dei file.
Il byte ID del supporto ha i seguenti significati:
ID descrittore multimediale |
Medio |
0F0H |
Floppy Disk da 3,5 pollici, doppia faccia, 18 settori (o altro) |
0F8H |
disco fisso |
0F9H |
Floppy disk da 5,25 pollici, doppia faccia, 15 settori |
0F9H |
Floppy disk da 3,5 pollici, doppia faccia, 9 settori |
0FCH |
Floppy disk da 5,25 pollici, monofacciale, 9 settori |
0FDH |
Floppy disk da 5,25 pollici, doppia faccia, 9 settori |
0FDH |
Floppy disk da 8 pollici, lato singolo, densità singola |
0FEH |
Floppy disk da 5,25 pollici, monofacciale, 8 settori |
0FEH |
Floppy disk da 8 pollici, lato singolo, densità singola |
0FEH |
Floppy disk da 8 pollici, doppia faccia, doppia densità |
0FFH |
Floppy disk da 5,25 pollici, doppia faccia, 8 settori |
INTERNO 21H (0x21)
Funzione 1CH (0x1C o 28) --> Ottieni dati di azionamento
Chiama con: AH = 1CH
DL = Codice unità
Restituisce: se la funzione ha esito positivo
AL = settori per cluster
DS: BX = segmento: offset del byte ID del supporto
CX = dimensione del settore fisico in byte
DX = numero di cluster per unità predefinita o specificata
Se la funzione non riesce e l'unità non è valida o è un errore critico
AL = FFH
Commenti:
Questa funzione ottiene informazioni di allocazione sull'unità disco specificata e un puntatore al byte di identificazione del supporto dalla sua tabella di allocazione file. Fare riferimento alla tabella dei byte ID descrittore del supporto, fornita in INT 21H, Funzione 1BH, per informazioni sull'ID del supporto.
INTERNO 21H (0x21)
Funzione 1DH (0x1D o 29) --> Riservato
INTERNO 21H (0x21)
Funzione 1EH (0x1E o 30) --> Riservato
INTERNO 21H (0x21)
Funzione 1FH (0x1F o 31) --> Riservato
INTERNO 21H (0x21)
Funzione 20H (0x20 o 32) --> Riservato
INTERNO 21H (0x21)
Funzione 21H (0x21 o 33) --> Lettura casuale
Chiama con: AH = 21H
DS: DX = segmento: offset del segmento aperto in precedenza
blocco di controllo file
Restituisce: AL = 00H se la lettura è riuscita
01H se fine del file
02H se il segmento si avvolge, la lettura viene annullata
03H se il record parziale è stato letto alla fine
file
Commenti:
Questa funzione legge un record selezionato da un file nella memoria. Il record viene letto nella memoria all'indirizzo corrente dell'area di trasferimento del disco, specificato dalla chiamata più recente alla funzione INT 21H 1AH.
INTERNO 21H (0x21)
Funzione 22H (0x22 o 34) --> Scrittura casuale
Chiama con: AH = 22H
DS: DX = segmento: offset del segmento aperto in precedenza
blocco di controllo file
Restituisce: AL = 00H se la scrittura è riuscita
01H se il disco è pieno
02H se il segmento si avvolge, la scrittura viene annullata
Commenti:
Questa funzione scrive i dati dalla memoria in un record selezionato in un file.
INTERNO 21H (0x21)
Funzione 23H (0x23 o 35) --> Ottieni dimensione file
Chiama con: AH = 23H
DS: DX = segmento: offset del file non aperto
blocco di controllo
Restituisce: se la funzione ha esito positivo e viene trovato il nome file corrispondente
AL = 00H
E il campo record relativo FCB (offset 21H) impostato sul numero di record nel file, arrotondato se necessario al record completo successivo
Se la funzione non riesce e non viene trovato alcun file corrispondente
AL = FFH
Commenti:
Questa funzione cerca un file corrispondente nella directory corrente; se ne trova uno, aggiorna l'FCB con la dimensione del file in termini di numero di record. Non esiste una dimensione di record predefinita per questa funzione, pertanto è necessario inserire un valore appropriato nel campo dimensione record FCB (offset 0EH) prima di chiamare questa funzione.
INTERNO 21H (0x21)
Funzione 24H (0x24 o 36) --> Imposta il numero di record relativo
Chiama con: AH = 24H
DS: DX = segmento: offset del segmento aperto in precedenza
blocco di controllo file
Restituisce: AL viene distrutto (l'altro registro non è interessato)
Campo record relativo FCB (offset 21H) aggiornato
Commenti:
Questa funzione imposta il campo del numero di record relativo di un blocco di controllo file (FCB) in modo che corrisponda alla posizione corrente del file registrata nel FCB aperto.
INTERNO 21H (0x21)
Funzione 25H (0x25 o 37) --> Imposta vettore di interrupt
Chiama con: AH = 25H
AL = numero di interruzione
DS: DX = segmento: offset della gestione degli interrupt
routine
Restituisce: Niente
Commenti:
Questa funzione inizializza un vettore di interrupt della CPU per puntare a una routine di gestione degli interrupt. Dovrebbe essere usata in preferenza alla modifica diretta della tabella dei vettori di interrupt da parte di applicazioni ben educate.
INTERNO 21H (0x21)
Funzione 26H (0x26 o 38) --> Crea nuovo prefisso segmento programma (PSP)
Chiama con: AH = 26H
DX = segmento: del nuovo segmento del programma
prefisso (PSP)
Restituisce: Niente
Commenti:
Questa funzione copia il prefisso del segmento di programma (PSP) del programma attualmente in esecuzione in un indirizzo di segmento specificato nella memoria libera, quindi aggiorna il nuovo PSP per renderlo utilizzabile da un altro programma.
INTERNO 21H (0x21)
Funzione 27H (0x27 o 39) --> Lettura casuale del blocco
Chiama con: AH = 27H
CX = numero di record da leggere
DS: DX = segmento: offset del segmento aperto in precedenza
blocco di controllo file
Restituisce: AL = 00H se tutti i record richiesti sono stati letti
01H se fine del file
02H se il segmento si avvolge
03H se il record parziale è stato letto alla fine
file
CX = numero effettivo di record letti
Commenti:
Questa funzione legge uno o più record sequenziali da un file nella memoria, a partire da una posizione file designata. Se la dimensione e la posizione del buffer sono tali che si verificherebbe un overflow o un wraparound del segmento, la funzione fallisce con un codice di ritorno di 02H e se un record parziale viene letto alla fine del file, il resto del record viene riempito con zeri.
INTERNO 21H (0x21)
Funzione 28H (0x28 o 40) --> Scrittura casuale di blocchi
Chiama con: AH = 28H
CX = numero di record da scrivere
DS: DX = segmento: offset del segmento aperto in precedenza
blocco di controllo file
Restituisce: AL = 00H se tutti i record richiesti sono stati scritti
01H se il disco è pieno
02H se il segmento si avvolge
CX = numero effettivo di record scritti
Commenti:
Questa funzione scrive uno o più record sequenziali dalla memoria a un file, iniziando da una posizione di file designata. Se la dimensione e la posizione del buffer sono tali che si verificherebbe un overflow o un wraparound del segmento, la funzione fallisce con un codice di ritorno 02H.
INTERNO 21H (0x21)
Funzione 29H (0x29 o 41) --> Analizza nome file
Chiama con: AH = 29H
AL = flag per controllare l'analisi
Bit 0 = 1, se i separatori iniziali saranno
scansionato (ignorato).
= 0, se i separatori iniziali non saranno
scansionato via
Bit 1 = 1, se il byte ID dell'unità in FCB sarà
modificato solo se un'unità era
specificato nella stringa analizzata.
= 0, se il byte ID dell'unità in FCB sarà
modificato indipendentemente, se non c'è unità
lo specificatore è presente nella stringa analizzata, il campo del codice di unità FCB è impostato su 0 (predefinito)
Bit 2 = 1, se il campo nome file in FCB sarà
modificato solo se è presente un nome file
specificato nella stringa analizzata.
= 0, se il campo nome file in FCB verrà modificato indipendentemente, se nessun nome file presenta la stringa analizzata, il nome file FCB verrà impostato su spazi ASCIIZ.
Bit 3 = 1, se il campo di estensione in FCB sarà
modificato, solo se è presente un'estensione
specificato nella stringa analizzata.
= 0, se il campo di estensione in FCB sarà
modificato comunque, se non c'è estensione
è presente nella stringa analizzata, FCB
l'estensione è impostata su spazi vuoti ASCIIZ
DS: SI = segmento: offset della stringa
ES: DI = segmento: offset del blocco di controllo del file
Restituisce: AL = 00H, se non sono presenti caratteri jolly
Incontrato 01H, se la stringa è stata analizzata
conteneva caratteri jolly FFH,
se lo specificatore di unità non è valido
DS: SI = segmento: offset del primo carattere
dopo il nome file analizzato
ES: DI = segmento: offset del formato
blocco di controllo file non aperto
Commenti:
Questa funzione analizza una stringa di testo nei vari campi di un blocco di controllo file (FCB).
Questa funzione considera i caratteri (: . ; , = + spazio di tabulazione ) come caratteri separatori e considera tutti i caratteri di controllo e i caratteri (: . ; , = + spazio di tabulazione < > | / “ [ ]) come caratteri di terminazione.
INTERNO 21H (0x21)
Funzione 2AH (0x2A o 42) --> Ottieni giorno e data
Chiama con: AH = 2AH
Restituisce: CX = anno (dal 1980 al 2099)
DH = mese (da 1 a 12)
DL = giorno (da 1 a 31)
AL = giorno della settimana (0 = domenica,
1= lunedì, ecc.)
Commenti:
Questa funzione ottiene il giorno del mese, il giorno della settimana, il mese e l'anno di sistema.
INTERNO 21H (0x21)
Funzione 2BH (0x2B o 43) --> Imposta data
Chiama con: AH = 2BH
CX = anno (dal 1980 al 2099)
DH = mese (da 1 a 12)
DL = giorno (da 1 a 31)
Restituisce: AL = 00H se la data è stata impostata correttamente
FFH se la data non è valida (ignorata)
Commenti:
Questa funzione inizializza il driver dell'orologio di sistema a una data specifica, ma l'ora di sistema rimane invariata.
INTERNO 21H (0x21)
Funzione 2CH (0x2C o 44) --> Ottieni tempo
Chiama con: AH = 2CH
Restituisce: CH = ore (da 0 a 23)
CL = minuti (da 0 a 59)
DH = secondi (da 0 a 59)
DL = centesimi di secondo (da 0 a 99)
Commenti:
Viene utilizzato per ottenere l'ora del giorno dal driver dell'orologio in tempo reale del sistema, convertita in ore, minuti, secondi e centesimi di secondo.
INTERNO 21H (0x21)
Funzione 2DH (0x2D o 45) --> Imposta ora
Chiama con: AH = 2DH
CH = ore (da 0 a 23)
CL = minuti (da 0 a 59)
DH = secondi (da 0 a 59)
DL = centesimi di secondo (da 0 a 99)
Restituisce: AL = 00H, se l'ora è stata impostata correttamente
FFH, se il tempo non è valido (ignorato)
Commenti:
Questa funzione inizializza l'orologio in tempo reale del sistema a un'ora, un minuto, un secondo e un centesimo di secondo specificati. La data del sistema non viene influenzata.
INTERNO 21H (0x21)
Funzione 2EH (0x2E o 46) --> Imposta flag di verifica
Chiama con: AH = 2EH
AL = 00H, se si disattiva il flag di verifica
01H, se si attiva il flag di verifica
DL = 00H
Restituisce: Niente
Commenti:
Questa funzione disattiva o attiva il flag del sistema operativo per la verifica automatica dei dati in lettura dopo scrittura. L'impostazione predefinita del flag di verifica è OFF perché la verifica in lettura dopo scrittura rallenta le operazioni del disco.
INTERNO 21H (0x21)
Funzione 2FH (0x2F o 47) --> Ottieni indirizzo DTA
Chiama con: AH = 2FH
Restituisce: ES: BX = segmento: offset dell'area di trasferimento del disco
Commenti:
Questa funzione ottiene l'indirizzo corrente dell'area di trasferimento del disco (DTA) per le operazioni di lettura/scrittura dei file FCB.
INTERNO 21H (0x21)
Funzione 30H (0x30 o 48) --> Ottieni il numero di versione MS-DOS
Chiama con: AH = 30H
AL = 00H
Restituisce: AL = numero della versione principale (MS-DOS 3.10=3, ecc.)
AH = numero di versione secondaria (MS-DOS 3.10= 0AH, ecc.)
BH = Produttore dell'attrezzatura originale
(OEM) numero di serie (dipendente dall'OEM, solitamente 00H per IBM)
PC-DOS, 0FFH o altri valori per MS-DOS)
BL: CX = numero di serie utente a 24 bit (facoltativo, dipendente dall'OEM)
Commenti:
Restituisce il numero di versione del sistema operativo MS-DOS host.
INTERNO 21H (0x21)
Funzione 31H (0x31 o 49) --> Termina e resta residente (TSR)
Chiama con: AH = 31H
AL = codice di ritorno
DX = quantità di memoria in paragrafi, da riservare
Non restituisce nulla
Commenti:
Questa funzione termina l'esecuzione del programma attualmente in esecuzione passando un codice di ritorno al processo padre, ma riserva parte o tutta la memoria del programma in modo che venga sovrapposta al prossimo programma transitorio da caricare. Questa funzione dovrebbe essere usata in preferenza a INT 27H perché supporta CS per contenere il segmento del prefisso del segmento di programma.
INTERNO 21H (0x21)
Funzione 32H (0x32 o 50) --> Riservato
INTERNO 21H (0x21)
Funzione 33H (0x33 o 51) --> Ottieni o imposta il flag di interruzione, ottieni l'unità di avvio
Chiama con: Se si riceve la bandiera di interruzione
AH = 33H
AL = 00H
Se si imposta il flag di interruzione
AH = 33H
AL = 01H
DL = 00H se si disattiva il flag di interruzione
01H se si attiva la bandiera di interruzione
Se si ottiene l'unità di avvio
AH = 33H
AL = 05H
Restituisce: se chiamato con AL = 00H o 01H
DL = 00H il flag di interruzione è OFF
La bandiera di interruzione 01H è attiva
Se chiamato con AL = 05H
DL = unità di avvio (1 = A, 2 = B, ecc.)
Commenti:
Questa funzione ottiene o modifica lo stato del flag di interruzione del sistema operativo, che influenza il controllo Ctrl-C durante le chiamate di funzione.
INTERNO 21H (0x21)
Funzione 34H (0x34 o 52) --> Riservato
INTERNO 21H (0x21)
Funzione 35H (0x35 o 53) --> Ottieni vettore di interrupt
Chiama con: AH = 35H
AL = numero di interruzione
Restituisce: ES: BX = segmento: offset del gestore di interrupt
Commenti:
Questa funzione ottiene l'indirizzo della routine corrente del gestore degli interrupt per l'interrupt macchina specificato.
INTERNO 21H (0x21)
Funzione 36H (0x36 o 54) --> Ottieni informazioni sull'allocazione dell'unità
Chiama con: AH = 36H
DL = codice unità (0 predefinito, 1 = A, ecc.)
Restituisce: se la funzione ha successo
AX = settore per cluster
BX = numero di cluster disponibili
CX = byte per settore
DX = cluster per unità
Se la funzione non riesce (unità non valida)
AX = FFFFH
Commenti:
Questa funzione ottiene informazioni selezionate su un'unità disco.
Questa funzione è molto importante nella programmazione del recupero dati e della risoluzione dei problemi del disco, poiché consente di calcolare la capacità dell'unità, lo spazio libero rimanente e molte altre informazioni importanti.
INTERNO 21H (0x21)
Funzione 37H (0x37 o 55) --> Riservato
INTERNO 21H (0x21)
Funzione 38H (0x38 o 56) --> Ottieni o imposta le informazioni sul paese
Chiama con: Se vuoi ottenere informazioni sul paese
AH = 38H
AL = 0, per ottenere informazioni aggiornate sul paese
1-FEH, per ottenere informazioni per
Paesi con codice <255
FFH, per ottenere informazioni sui paesi
con codice >=255
BX = codice paese, se AL = FFH
DS:DX = segmento: offset del buffer per le informazioni restituite
Se si imposta il codice paese corrente
AH = 38H
AL = 1-FEH, codice paese per i paesi con codice <255
FFH, per i paesi con codice >=255
BX = codice paese, se AL = 0FFH
DX = FFFFH
Resi:
Se la funzione ha successo
Porta bandiera = libera
E, se si ottengono informazioni sull'internazionalizzazione
BX = prefisso internazionale
DS: DX = segmento: offset del buffer contenente le informazioni di internazionalizzazione.
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione ottiene informazioni internazionali per il paese corrente o specificato oppure imposta il codice paese corrente.
INTERNO 21H (0x21)
Funzione 39H (0x39 o 57) --> Crea directory
Chiama con: AH = 39H
DS: DX = segmento: offset del percorso ASCIIZ
Restituisce: se la funzione ha successo
Porta bandiera = libera
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione crea una directory utilizzando l'unità e il percorso specificati.
ASCIIZ è noto come sequenza di caratteri ASCII terminanti con Null o Zero, Byte. |
INTERNO 21H (0x21)
Funzione 3AH (0x3A o 58) --> Elimina directory
Chiama con: AH = 3AH
DS: DX = segmento: offset del percorso ASCIIZ
Restituisce: se la funzione ha successo
Porta bandiera = libera
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione rimuove una directory usando l'unità e il percorso specificati. Se un elemento del pathname non esiste o la directory non è vuota o l'accesso è negato o la directory specificata è anche la directory corrente, la funzione di eliminazione della directory fallisce.
INTERNO 21H (0x21)
Funzione 3BH (0x3B o 59) --> Imposta la directory corrente
Chiama con: AH = 3BH
DS: DX = segmento: offset del percorso ASCIIZ
Restituisce: se la funzione ha successo
Porta bandiera = libera
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione imposta la directory corrente o predefinita utilizzando l'unità e il percorso specificati. Se il percorso specificato o un qualsiasi elemento del percorso non esiste, la funzione fallisce.
INTERNO 21H (0x21)
Funzione 3CH (0x3C o 60) --> Crea file
Chiama con: AH = 3CH
CX = attributo del file, dove attributo
i bit significativi possono essere combinati.
Il significato dei bit è riportato nella seguente tabella:
Pezzo(i) |
Significato (se impostato) |
0 |
Di sola lettura |
1 |
Nascosto |
2 |
Sistema |
3 |
Etichetta del volume |
4 |
Riservato (0) |
5 |
Archivio |
6 – 15 |
Riservato (0) |
DS: DX = segmento: offset di ASCIIZ
nome del percorso
Restituisce: se la funzione ha successo
Porta bandiera = libera
AX = maniglia
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Se viene specificato un pathname ASCIIZ, questa funzione crea un nuovo file nella directory designata o predefinita sull'unità disco designata o predefinita. Se il file specificato esiste già, viene troncato a lunghezza zero. In entrambi i casi, il file viene aperto e viene restituito un handle che può essere utilizzato dal programma per l'accesso successivo al file.
Se un elemento del percorso non esiste o il file viene creato nella directory radice e la directory radice è piena o l'accesso è negato o un file con attributo di sola lettura è già presente nella directory specificata, la funzione di creazione del file fallisce.
INTERNO 21H (0x21)
Funzione 3DH (0x3D o 61) --> Apri file
Chiama con: AH = 3DH
AL = modalità di accesso
Il significato dei bit della modalità di accesso è riportato nella seguente tabella:
Pezzi |
Significato |
0 – 2 |
Modalità di accesso
000 = accesso in lettura
001 = accesso in scrittura
010 = accesso in lettura/scrittura |
3 |
Riservato (0) |
4 – 6 |
Modalità di condivisione
000 = modalità di compatibilità
001 = nega tutto
010 = nega scrittura
011 = nega lettura
100 = nega nessuno |
7 |
Flag di ereditarietà
0 = il processo figlio eredita l'handle
1 = il figlio non eredita l'handle |
DS: DX = segmento: offset del percorso ASCIIZ
Restituisce: se la funzione ha successo
Porta bandiera = libera
AX = maniglia
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Se viene specificato un pathname ASCIIZ, questa funzione apre il file specificato nella directory designata o predefinita sull'unità disco designata o predefinita. Viene restituito un handle che può essere utilizzato dal programma per l'accesso successivo al file.
INTERNO 21H (0x21)
Funzione 3EH (0x3E o 62) --> Chiudi file
Chiama con: AH = 3EH
BX = maniglia
Restituisce: se la funzione ha successo
Porta bandiera = libera
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione svuota tutti i buffer interni associati al file su disco, chiude il file e rilascia l'handle per il riutilizzo, di un handle precedentemente aperto o creato con successo. Se il file è stato modificato, la marca temporale e la data e la dimensione del file vengono aggiornate nella voce di directory del file.
INTERNO 21H (0x21)
Funzione 3FH (0x3F o 63) --> Leggi file o dispositivo
Chiama con: AH = 3FH
BX = maniglia
CX = numero di byte da leggere
DS: DX = segmento: offset del buffer
Restituisce: se la funzione ha successo
Porta bandiera = libera
AX = byte trasferito
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione trasferisce i dati nella posizione corrente del puntatore del file dal file al buffer e quindi aggiorna la posizione del puntatore del file per un dato handle di file valido da una precedente operazione di apertura o creazione, un indirizzo buffer e una lunghezza in byte.
INTERNO 21H (0x21)
Funzione 40H (0x40 o 64) --> Scrivi file o dispositivo
Chiama con: AH = 40H
BX = maniglia
CX = numero di byte da scrivere
DS: DX = segmento: offset del buffer
Restituisce: se la funzione ha successo
Porta bandiera = libera
AX = byte trasferito
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione trasferisce i dati dal buffer al file e quindi aggiorna la posizione del puntatore del file per un handle di file valido dato da una precedente operazione di apertura o creazione, un indirizzo del buffer e una lunghezza in byte. Se la funzione viene chiamata con CX = 0, il file viene troncato o esteso alla posizione corrente del puntatore del file.
INTERNO 21H (0x21)
Funzione 41H (0x41 o 65) --> Elimina file
Chiama con: AH = 41H
DS: DX = segmento: offset del percorso ASCIIZ
Restituisce: se la funzione ha successo
Porta bandiera = libera
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione elimina un file dal disco e dalla directory predefiniti o specificati. La funzione elimina un file sostituendo il primo carattere del suo nome file nella directory radice con il carattere E5H (0xE5) e rendendo i cluster del file disponibili per i nuovi dati nella tabella di allocazione dei file. Fino a quel momento, i dati effettivi archiviati in quei cluster non vengono sovrascritti.
INTERNO 21H (0x21)
Funzione 42H (0x42 o 66) --> Imposta il puntatore del file
Chiama con: AH = 42H
AL = codice metodo
00H offset assoluto dall'inizio del file
01H offset firmato dal file corrente
puntatore
02H offset firmato dalla fine del file
BX = maniglia
CX = metà più significativa dell'offset
DX = metà meno significativa dell'offset
Restituisce: se la funzione ha esito positivo
Porta bandiera = libera
DX = metà più significativa del file risultante
puntatore
AX = metà meno significativa del file risultante
puntatore
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione imposta la posizione del puntatore del file rispetto all'inizio del file, alla fine del file o alla posizione corrente del file.
INTERNO 21H (0x21)
Funzione 43H (0x43 o 67) --> Ottieni o imposta gli attributi del file
Chiama con: AH = 43H
AL = 00H per ottenere gli attributi
01H per impostare gli attributi
CX = attributo file, se AL=01H. I bit possono essere combinati
DS: DX = segmento: offset del percorso ASCIIZ
Restituisce: se la funzione ha successo
Porta bandiera = libera
CX = attributo del file
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione ottiene o modifica gli attributi del file (sola lettura, nascosto, sistema o archivio) o della directory. Per il significato dei bit per i diversi attributi, fare riferimento alla tabella di significato dei bit fornita in precedenza.
INTERNO 21H (0x21)
Funzione 44H (0x44 o 68) --> Controllo Input/Output (I/O Ctrl)
Questa funzione fornisce un percorso diretto di comunicazione tra un programma applicativo e un driver di dispositivo. Consente a un programma di ottenere informazioni dipendenti dall'hardware e di richiedere operazioni che non sono supportate da altre chiamate di funzione MS-DOS.
Le sottofunzioni del Controllo di Input e Output sono riportate nella seguente tabella:
Sottofunzione |
Nome dell'operazione |
ore 00:00 |
Ottieni informazioni sul dispositivo |
01H |
Imposta informazioni dispositivo |
ore 02:00 |
Ricezione dei dati di controllo dal driver del dispositivo del carattere |
ore 03:00 |
Invia dati di controllo al driver del dispositivo carattere |
ore 04:00 |
Ricevi dati di controllo dal driver del dispositivo a blocchi |
ore 05:00 |
Invia dati di controllo al driver del dispositivo a blocchi |
ore 06:00 |
Controlla lo stato dell'input |
ore 07:00 |
Controlla lo stato dell'output |
ore 08:00 |
Controlla se il dispositivo a blocchi è rimovibile |
ore 09:00 |
Controlla se il dispositivo a blocchi è remoto |
0AH (10) |
Controllare se la maniglia è remota |
0BH (11) |
Modifica il conteggio dei tentativi di condivisione |
0CH (12)
|
Controllo I/O generico per dispositivi a caratteri
Valore |
Descrizione |
CL = 45H |
Imposta conteggio iterazione |
CL = 4AH |
Seleziona la pagina codice |
CL = 4CH |
Avvia la preparazione della pagina di codice |
CL = 4DH |
Preparazione della pagina di codice finale |
CL = 5FH |
Imposta informazioni di visualizzazione |
CL = 65H |
Ottieni conteggio iterazione |
CL = 6AH |
Query sulla pagina di codice selezionata |
CL = 6BH |
Query Prepara Elenco |
CL = 7FH |
Ottieni informazioni di visualizzazione |
|
0D (13)
|
Controllo I/O generico per dispositivi a blocchi
Valore |
Descrizione |
CL = 40H |
Imposta i parametri del dispositivo |
CL = 41H |
Scrivi traccia |
CL = 42H |
Formatta e verifica traccia |
CL = 47H |
Imposta flag di accesso |
CL = 60H |
Ottieni i parametri del dispositivo |
CL = 61H |
Leggi la traccia |
CL = 62H |
Verifica traccia |
CL = 67H |
Ottieni l'accesso Segnala |
|
0EH (14) |
Ottieni la mappa dell'unità logica |
0FH (15) |
Imposta mappa unità logica |
INTERNO 21H (0x21)
Funzione 44H (0x44 o 68), sottofunzione 00H (0x00) I/O Ctrl --> ottieni informazioni sul dispositivo
Chiama con: AH = 44H
AL = 00H
BX = maniglia
Restituisce: se la funzione ha successo
Porta bandiera = libera
DX = parola informativa del dispositivo
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa sottofunzione restituisce una parola informativa sul dispositivo per il file o il dispositivo associato all'handle specificato.
INTERNO 21H (0x21)
Funzione 44H (0x44 o 68), sottofunzione 01H (0x01) I/O Ctrl --> imposta le informazioni del dispositivo
Chiama con: AH = 44H
AL = 01H
BX = maniglia
DX = parola informativa del dispositivo
Restituisce: se la funzione ha successo
Porta bandiera = libera
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa sottofunzione della funzione 44H di INT 21H imposta determinati flag per un handle associato a un dispositivo di caratteri. Questa sottofunzione non può essere utilizzata per un handle associato a un file.
INTERNO 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 02H (0x02) I/O Ctrl --> leggi il driver del dispositivo carattere dati di controllo
Chiama con: AH = 44H
AL = 02H
BX = maniglia
CX = numero di byte da leggere
DS: DX = segmento: offset del buffer
Restituisce: se la funzione ha esito positivo
Porta bandiera = libera
AX = byte letti
E il buffer contiene i dati di controllo dal driver
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Legge i dati di controllo da un driver di dispositivo a caratteri. La lunghezza e il contenuto dei dati sono specificati per ogni driver di dispositivo e non seguono alcun formato standard. Questa funzione non comporta necessariamente alcun input dal dispositivo fisico.
INTERNO 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 03H (0x03) I/O Ctrl --> scrittura dati di controllo driver dispositivo carattere
Chiama con: AH = 44H
AL = 03H
BX = maniglia
CX = numero di byte da scrivere
DS: DX = segmento: offset dei dati
Restituisce: se la funzione ha successo
Porta bandiera = libera
AX = byte trasferiti
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa sottofunzione trasferisce i dati di controllo da un'applicazione a un driver di dispositivo a caratteri. La lunghezza e il contenuto dei dati sono specifici per ogni driver di dispositivo e non seguono alcun formato standard. Questa funzione non genera necessariamente alcun output sul dispositivo fisico.
INTERNO 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 04H (0x04) I/O Ctrl --> Leggi i dati di controllo del driver del dispositivo a blocchi
Chiama con: AH = 44H
AL = 04H
BL = codice dispositivo (0= predefinito, 1=A, 2=B, ecc.)
CX = numero di byte da leggere
DS: DX = segmento: offset del buffer
Restituisce: se la funzione ha successo
Porta bandiera = libera
AX = byte trasferiti
E il buffer contiene i dati di controllo dal driver del dispositivo
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa sottofunzione trasferisce i dati di controllo da un driver di dispositivo a blocchi direttamente nel buffer di un programma applicativo. La lunghezza e il contenuto dei dati sono specifici per ogni driver di dispositivo e non seguono alcun formato standard. Questa funzione non comporta necessariamente un input dal dispositivo fisico.
INTERNO 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 05H (0x05) I/O Ctrl --> scrittura blocco dati di controllo driver dispositivo
Chiama con: AH = 44H
AL = 05H
BL = codice dispositivo (0= predefinito, 1=A, 2=B, ecc.)
CX = numero di byte da scrivere
DS: DX = segmento: offset dei dati
Restituisce: se la funzione ha successo
Porta bandiera = libera
AX = byte trasferiti
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa sottofunzione trasferisce i dati di controllo da un programma applicativo direttamente a un driver di dispositivo a blocchi. La lunghezza e il contenuto dei dati di controllo sono specifici per ogni driver di dispositivo e non seguono alcun formato standard. Questa funzione non genera necessariamente alcun output sul dispositivo fisico.
INTERNO 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 06H (0x06) I/O Ctrl --> controlla lo stato dell'input
Chiama con: AH = 44H
AL = 06H
BX = maniglia
Restituisce: se la funzione ha successo
Porta bandiera = libera
E per un dispositivo:
AL = 00H, se il dispositivo non è pronto
FFH, se il dispositivo è pronto
Per un file:
AL = 00H, se il puntatore del file è in EOF
FFH, se il puntatore del file non è in EOF
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Restituisce un codice che indica se il dispositivo o i file associati a un handle sono pronti per l'input.
INTERNO 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 07H (0x07) I/O Ctrl --> controlla lo stato dell'output
Chiama con: AH = 44H
AL = 07H
BX = maniglia
Restituisce: se la funzione ha successo
Porta bandiera = libera
E per un dispositivo:
AL = 00H, se il dispositivo non è pronto
FFH, se il dispositivo è pronto
Per un file:
AL = FFH
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Restituisce un codice che indica se il dispositivo associato a un handle è pronto per l'output.
INTERNO 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 08H (0x08) I/O Ctrl --> controlla se il dispositivo a blocchi è rimovibile
Chiama con: AH = 44H
AL = 08H
BL = numero dell'unità (0 = predefinito, 1=A, 2=B, ecc.)
Restituisce: se la funzione ha successo
Porta bandiera = libera
AL = 00H, se il mezzo è rimovibile
01H, se il supporto non è rimovibile
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa sottofunzione controlla se il dispositivo a blocchi specificato contiene un supporto di memorizzazione rimovibile, come un floppy disk. Se un file non viene trovato come previsto su un'unità specifica, un programma può usare questa sottofunzione per determinare se all'utente deve essere richiesto di inserire un altro disco.
INTERNO 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 09H (0x09) I/O Ctrl --> controlla se il dispositivo a blocchi è remoto
Chiama con: AH = 44H
AL = 09H
BL = numero dell'unità (0 = predefinito, 1=A, 2=B, ecc.)
Restituisce: se la funzione ha successo
Porta bandiera = libera
DX = parola attributo dispositivo
bit 12 = 0, se l'unità è locale
= 1, se l'unità è remota
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa sottofunzione controlla se il dispositivo a blocchi specificato è locale (collegato al computer che esegue il programma) o remoto (reindirizzato a un server di rete).
INTERNO 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 0AH (0x0A o 10) I/O Ctrl --> controlla se la maniglia è remota
Chiama con: AH = 44H
AL = 0AH
BX = maniglia
Restituisce: se la funzione ha successo
Porta bandiera = libera
DX = parola attributo per file o dispositivo
bit 15 = 0 se locale
1 se remoto
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Controlla se l'handle specificato fa riferimento a un file o dispositivo locale (situato sul PC che esegue il programma) o remoto (situato su un server di rete).
INTERNO 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 0BH (0x0B o 11) I/O Ctrl --> modifica conteggio tentativi di condivisione
Chiama con: AH = 44H
AL = 0BH
CX = ritardi per tentativo (predefinito = 1)
DX = numero di tentativi (predefinito = 3)
Restituisce: se la funzione ha successo
Porta bandiera = libera
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa sottofunzione imposta il numero di volte in cui MS-DOS ritenta un'operazione su disco dopo un errore causato da una violazione della condivisione file prima di restituire un errore al processo richiedente. Questa sottofunzione non è disponibile a meno che non venga caricato il modulo di condivisione file.
INTERNO 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 0CH (0x0C o 12) I/O Ctrl controllo I/O generico per dispositivi a caratteri
Chiama con: AH = 44H
AL = 0CH
BX = maniglia
CH =codice categoria (principale):
00H = sconosciuto
01H = COM1, COM2, COM3, O COM4
03H = CON (tastiera e display)
05H = LPT1, LPT2 o LPT3
CL = codice funzione (minore):
45H = Imposta conteggio iterazioni
4AH = Seleziona la pagina codice
4CH = Avvia la preparazione della pagina di codice
4DH = Fine preparazione pagina codice
5FH = Imposta informazioni di visualizzazione
65H = Ottieni conteggio iterazioni
6AH = Query codice pagina selezionato
6BH = Query Prepara Elenco
7FH = Ottieni informazioni di visualizzazione
DS: DX = segmento: offset del blocco parametri
Restituisce: se la funzione ha successo
Porta bandiera = libera
E se chiamato con CL = 65H, 6AH, 6BH o 7FH
DS: DX = segmento: offset del blocco parametri
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Fornisce un meccanismo di uso generale per la comunicazione tra programmi applicativi e driver di dispositivi a caratteri.
INTERNO 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 0DH (0x0D o 13) I/O Ctrl --> controllo I/O generico per dispositivi a blocchi
Chiama con: AH = 44H
AL = 0DH
BL = codice unità (0 = predefinito, 1 = A, 2 = B, ecc.)
CH = codice categoria (principale):
08H = unità disco
CL = codice funzione (minore):
40H = Imposta parametri unità
41H = Scrivi traccia
42H = Formatta e verifica traccia
47H = Imposta flag di accesso
60H = Ottieni parametri dispositivo
61H = Leggi traccia
62H = Verifica traccia
67H = Ottieni il flag di accesso
DS: DX = segmento: offset del blocco parametri
Restituisce: se la funzione ha successo
Porta bandiera = libera
E se chiamato con CL = 60H o 61H
DS: DX = segmento: offset del blocco parametri
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa sottofunzione fornisce un meccanismo di uso generale per la comunicazione tra programmi applicativi e driver di dispositivi a blocchi. Consente a un programma di ispezionare o modificare i parametri del dispositivo per un'unità logica e di leggere, scrivere, formattare e verificare le tracce del disco in modo indipendente dall'hardware.
INTERNO 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 0EH (0x0E o 14) I/O Ctrl -->> Ottieni mappa unità logica
Chiama con: AH = 44H
AL = 0EH
BL = codice unità (0 = predefinito, 1=A, 2=B, ecc.)
Restituisce: se la funzione ha successo
Porta bandiera = libera
AL = codice di mappatura
00H, se è presente un solo codice di unità logica
assegnato al dispositivo a blocchi
Codice unità logica 01H-1AH (1=A,
2=B, ecc.) mappato sul dispositivo a blocchi
Se la funzione non riesce
Porta bandiera = impostato
AX =codice di errore
Commenti:
Restituisce il codice dell'unità logica utilizzata più di recente per accedere all'unità a blocchi specificata.
INTERNO 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 0FH (0x0F o 15) I/O Ctrl --> imposta mappa unità logica
Chiama con: AH = 44H
AL = 0FH
BL = codice unità (0 = predefinito, 1=A, 2=B, ecc.)
Restituisce: se la funzione ha successo
Porta bandiera = libera
AL = codice di mappatura
00H, se è presente un solo codice di unità logica
assegnato al dispositivo a blocchi
01H-1AH, codice unità logica (1=A,
2=B, ecc.) mappato sul
dispositivo a blocchi
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa sottofunzione imposta il codice dell'unità logica successiva che verrà utilizzata per fare riferimento a un dispositivo a blocchi.
INTERNO 21H (0x21)
Funzione 45H (0x45 o 69) --> Duplica handle
Chiama con: AH = 45H
BX = handle da duplicare
Restituisce: se la funzione ha successo
Porta bandiera = libera
AX = nuovo handle
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione restituisce un nuovo handle che fa riferimento allo stesso dispositivo o file nella stessa posizione per l'handle specificato per un dispositivo o file attualmente aperto.
INTERNO 21H (0x21)
Funzione 46H (0x46 o 70) --> Gestore di reindirizzamento
Chiama con: AH = 46H
BX = handle per file o dispositivo
CX = handle per essere reindirizzati
Restituisce: se la funzione ha successo
Porta bandiera = libera
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Se ci sono due handle dati, questa funzione fa sì che il secondo handle faccia riferimento allo stesso dispositivo o file nella stessa posizione del primo handle. Si dice quindi che il secondo handle è reindirizzato.
INTERNO 21H (0x21)
Funzione 47H (0x47 o 71) --> Ottieni la directory corrente
Chiama con: AH = 47H
DL = codice unità (0 = predefinito, 1 = A,
2=B, ecc.)
DS: SI = segmento: offset del buffer da 64 byte
Restituisce: se la funzione ha esito positivo
Porta bandiera = libera
E il buffer viene riempito con il percorso completo dalla radice della directory corrente.
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione ottiene una stringa ASCIIZ che descrive il percorso dalla radice alla directory corrente e il nome di tale directory.
INTERNO 21H (0x21)
Funzione 48H (0x48 o 72) --> Assegna blocco di memoria
Chiama con: AH = 48H
BX = numero di paragrafi di memoria
necessario
Restituisce: se la funzione ha successo
Porta bandiera = libera
Ax = indirizzo del segmento base assegnato
bloccare
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
BX = dimensione del blocco più grande disponibile
(paragrafi)
Commenti:
Assegna un blocco di memoria e restituisce un puntatore all'inizio dell'area allocata.
INTERNO 21H (0x21)
Funzione 49H (0x49 o 73) --> Rilascia blocco di memoria
Chiama con: AH = 49H
ES = segmento del blocco da rilasciare
Restituisce: se la funzione ha successo
Porta bandiera = libera
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione è usata per rilasciare un blocco di memoria e renderlo disponibile per l'uso da parte di altri programmi. La funzione fallirà o può causare errori di sistema imprevedibili se il programma rilascia un blocco di memoria che non gli appartiene o l'indirizzo di segmento passato nel registro ES non è un indirizzo di base valido per un blocco di memoria esistente.
INTERNO 21H (0x21)
Funzione 4AH (0x4A o 74) --> Ridimensiona blocco di memoria
Chiama con: AH = 4AH
BX = nuova dimensione del blocco desiderata nei paragrafi
ES = segmento del blocco da modificare
Restituisce: se la funzione ha successo
Porta bandiera = libera
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
BX = dimensione massima del blocco disponibile
(paragrafi)
Commenti:
Questa funzione riduce o estende dinamicamente un blocco di memoria, in base alle esigenze di un programma applicativo.
INTERNO 21H (0x21)
Funzione 4BH (0x4B o 75) --> Esegui programma (EXEC)
Chiama con: AH = 4BH
AL = sottofunzione
00H = Carica ed esegui programma
03H = Sovrapposizione di carico
ES: BX = segmento: offset del blocco parametri
DS: DX = segmento: offset del programma ASCIIZ
nome del percorso
Restituisce: se la funzione ha successo
Porta bandiera = libera
I registri vengono conservati secondo le consuete modalità.
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione consente a un programma applicativo di eseguire un altro programma, riprendendone il controllo quando è terminato. Può anche essere utilizzata per caricare overlay, sebbene questo utilizzo sia poco comune.
INTERNO 21H (0x21)
Funzione 4CH (0x4C o 76) --> Termina il processo con codice di ritorno
Chiama con: AH = 4CH
AL = codice di ritorno
Restituisce: Niente
Commenti:
Questa funzione termina il processo corrente, passando un codice di ritorno al processo padre. Questo è uno dei vari metodi che un programma può usare per eseguire un'uscita finale.
INTERNO 21H (0x21)
Funzione 4DH (0x4D o 77) --> Ottieni il codice di ritorno
Chiama con: AH = 4DH
Restituisce: AH = tipo di uscita
00H, se terminazione normale tramite INT 20H, INT 21H
Funzione 00H o INT 21H Funzioni 4CH
01H se terminazione tramite immissione di Ctrl-C da parte dell'utente
02H se terminazione tramite gestore di errori critici
03H se terminazione tramite INT21H Funzione 31H o
INT 27H |
AL = codice di ritorno passato dal processo figlio
(0 se il bambino è stato terminato da INT 20H,
INT 21H Funzione 00H, o INT 27H)
Commenti:
Questa funzione viene utilizzata da un processo padre, dopo l'esecuzione corretta di una chiamata EXEC (INT 21H Funzione 4BH), per ottenere il codice di ritorno e il tipo di terminazione di un processo figlio.
INTERNO 21H (0x21)
Funzione 4EH (0x4E o 78) --> Trova il primo file
Chiama con: AH = 4EH
CX = attributo di ricerca (i bit possono essere combinati)
DS: DX = segmento: offset del percorso ASCIIZ
Restituisce: se la funzione ha esito positivo e viene trovato il file corrispondente
Porta bandiera = libera
E i risultati della ricerca restituiti nell'area di trasferimento del disco corrente sono i seguenti:
Cambiamento(i) |
Descrizione |
dalle 00:00 alle 14:00 |
Riservato (0) |
ore 15.00 |
Attributo del file o della directory corrispondente |
dalle 16 alle 17 |
Bit di tempo del file
00H-04H = incrementi di 2 secondi (0-29)
bit 05H-0AH = minuti (0-59)
bit 0BH-0FH = ore (0-23) |
dalle 18 alle 19
|
Data file
bit 00H-04H = giorno (1-31)
bit 05H-08H = mese (1-12)
bit 09H-0FH = anno (relativo al 1980) |
1AH-1DH |
Dimensione del file |
1EH-2AH |
Nome file ASCIIZ ed estensione |
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione cerca la directory predefinita o specificata sull'unità predefinita o specificata per il primo file corrispondente per una specifica di file data sotto forma di stringa ASCIIZ. Per il significato in bit degli attributi, fare riferimento alla tabella dei significati in bit fornita in precedenza.
INTERNO 21H (0x21)
Funzione 4FH (0x4F o 79) --> Trova il file successivo
Chiama con: AH = 4FH
Restituisce: se la funzione ha esito positivo e viene trovato il file corrispondente
Porta bandiera = libera
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Se è presente una precedente chiamata riuscita alla funzione INT 21H 4EH, questa funzione trova il file successivo nella directory predefinita o specificata sull'unità predefinita o specificata che corrisponde alla specifica del file originale.
INTERNO 21H (0x21)
Funzione 50H (0x50 o 80) --> Riservato
INTERNO 21H (0x21)
Funzione 51H (0x51 o 81) --> Riservato
INTERNO 21H (0x21)
Funzione 52H (0x52 o 82) --> Riservato
INTERNO 21H (0x21)
Funzione 53H (0x53 o 83) --> Riservato
INTERNO 21H (0x21)
Funzione 54H (0x54 o 84) --> Ottieni flag di verifica
Chiama con: AH = 54H
Restituisce: AL = valore del flag di verifica corrente
00H se verifica disattivata
01H se verifica su
Commenti:
Questa funzione ottiene il valore corrente del flag di verifica del sistema (lettura dopo scrittura).
INTERNO 21H (0x21)
Funzione 55H (0x55 o 85) --> Riservato
INTERNO 21H (0x21)
Funzione 56H (0x56 o 86) --> Rinomina file
Chiama con: AH = 56H
DS: DX = segmento: offset dell'ASCIIZ corrente
nome del percorso
ES: DI = segmento: offset del nuovo ASCIIZ
nome del percorso
Restituisce: se la funzione ha successo
Porta bandiera = libera
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione Rinomina un file e/o sposta la sua voce di directory in un'altra sullo stesso disco. Nelle versioni MS-DOS 3.0 e successive, questa funzione può essere utilizzata anche per rinominare le directory
Se un elemento del percorso non esiste o esiste già un file con il nuovo percorso o la specifica del percorso corrente contiene un'unità disco diversa da quella del nuovo percorso o il file viene spostato nella directory radice e la directory radice è piena o l'utente non ha diritti sufficienti, la funzione per rinominare i file fallisce.
INTERNO 21H (0x21)
Funzione 57H (0x57 o 87) --> Ottieni o imposta la data e l'ora del file
Chiama con: Se vuoi ottenere data e ora
AH = 57H
AL = 00H
BX = maniglia
Se si imposta la data e l'ora
AH = 57H
AL = 01H
BX = maniglia
CX = tempo
bit 00H-04H = incrementi di 2 secondi (0-29)
bit 05H-0AH = minuti (0-59)
bit 0BH-0FH = ore (0-23)
DX = data
bit 00H-04H = giorno (1-31)
bit 05H-08H = mese (1-12)
bit 09H-0FH = anno (relativo al 1980)
Restituisce: se la funzione ha successo
Porta bandiera = libera
e, se chiamato con AL = 00H
CX = tempo
DX = data
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione ottiene o modifica la data e l'ora nella voce della directory radice del file.
INTERNO 21H (0x21)
Funzione 58H (0x58 o 88) --> Ottieni o imposta la strategia di allocazione
Chiama con: Se si ottiene il codice strategico
AH = 58H
AL = 00H
Se si imposta il codice della strategia
AH = 58H
AL = 01H
BX = codice strategia desiderato
00H = prima misura
01H = migliore adattamento
02H = ultima misura
Restituisce: se la funzione ha successo
Porta bandiera = libera
e, se chiamato con AL = 00H
AX = codice strategia corrente
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Ottiene o modifica il codice che indica la strategia MS-DOS corrente per l'allocazione dei blocchi di memoria. La strategia di allocazione della memoria MS-DOS predefinita è First Fit (codice 0).
Nella prima allocazione di memoria, MS-DOS ricerca i blocchi di memoria disponibili dall'indirizzo più basso a quello più alto, assegnando il primo sufficientemente grande da soddisfare la richiesta di allocazione del blocco.
Nel caso della strategia di allocazione Best fit, MS-DOS cerca tutti i blocchi di memoria disponibili e assegna il blocco più piccolo disponibile che soddisferà la richiesta, indipendentemente dalla sua posizione.
Nella strategia di allocazione della memoria Last fit, MS-DOS ricerca i blocchi di memoria disponibili dagli indirizzi alti a quelli bassi, assegnando quello più alto abbastanza grande da soddisfare la richiesta di allocazione del blocco.
INTERNO 21H (0x21)
Funzione 59H (0x59 o 89) --> Ottieni informazioni estese sull'errore
Chiama con: AH = 59H
BX = 00H
Restituisce: AX = codice di errore esteso
Di seguito è riportata la tabella dei codici di errore:
Codice di errore |
Errore |
01H |
numero di funzione non valido |
ore 02:00 |
file non trovato |
ore 03:00 |
percorso non trovato |
ore 04:00 |
troppi file aperti |
ore 05:00 |
accesso negato |
ore 06:00 |
gestire non valido |
ore 07:00 |
blocchi di controllo della memoria distrutti |
ore 08:00 |
memoria insufficiente |
ore 09:00 |
indirizzo blocco memoria non valido |
0AH (10) |
ambiente non valido |
0BH (11) |
formato non valido |
0CH (12) |
codice di accesso non valido |
0D (13) |
dati non validi |
0EH (14) |
unità sconosciuta |
0FH (15) |
unità disco non valida |
10 ore (16) |
tentato di rimuovere la directory corrente |
11 ore (17) |
non è lo stesso dispositivo |
12 ore (18) |
non ci sono più file |
13 ore (19) |
disco protetto da scrittura |
14 ore (20) |
unità sconosciuta |
15 ore (21) |
unità non pronta |
16 ore (22) |
comando sconosciuto |
17 ore (23) |
errore dati (CRC) |
18 ore (24) |
lunghezza della struttura della richiesta non valida |
19 ore (25) |
errore di ricerca |
1 AH (26) |
tipo di media sconosciuto |
1 camera da letto (27) |
settore non trovato |
1 canale (28) |
stampante senza carta |
1D (29) |
errore di scrittura |
1E (30) |
errore di lettura |
1FH (31) |
fallimento generale |
20 ore (32) |
violazione della condivisione |
21 ore (33) |
violazione di blocco |
22 ore (34) |
cambio disco non valido |
23 ore (35) |
FCB non disponibile |
24 ore (36) |
buffer di condivisione superato |
dalle 25 alle 31 |
prenotato |
32 ore (50) |
richiesta di rete non supportata |
33 ore (51) |
macchina remota non in ascolto |
34 ore (52) |
nome duplicato sulla rete |
35 ore (53) |
nome di rete non trovato |
36 ore (54) |
rete occupata |
37 ore (55) |
il dispositivo non esiste più sulla rete |
38 ore (56) |
limite di comando net BIOS superato |
39 ore (57) |
errore nell'hardware della scheda di rete |
3 AH (58) |
risposta errata dalla rete |
3BH (59) |
errore di rete imprevisto |
3 canali (60) |
adattatore remoto incompatibile |
3D (61) |
coda di stampa piena |
3EH (62) |
non c'è abbastanza spazio per il file di stampa |
3FH (63) |
file di stampa annullato |
40 ore (64) |
nome della rete cancellato |
41 ore (65) |
accesso alla rete negato |
42 ore (66) |
tipo di dispositivo di rete non corretto |
43 ore (67) |
nome di rete non trovato |
44 ore (68) |
limite nomi rete superato |
45 ore (69) |
superato il limite della sessione BIOS di rete |
46 ore (70) |
condivisione file temporaneamente sospesa |
47 ore (71) |
richiesta di rete non accettata |
48 ore (72) |
stampa o reindirizzamento del disco in pausa |
49H-4FH |
prenotato |
50 ore (80) |
il file esiste già |
51 ore (81) |
prenotato |
52 ore (82) |
non è possibile creare la directory |
53 ore (83) |
errore su INT 24H (errore critico) |
54 ore (84) |
troppi reindirizzamenti |
55 ore (85) |
reindirizzamento duplicato |
56 ore (86) |
password non valida |
57 ore (87) |
parametro non valido |
58 ore (88) |
guasto del dispositivo di rete |
59 ore (89) |
funzione non supportata dalla rete |
5AH (90) |
componente di sistema richiesto non installato |
BH = classe di errore
01H |
se esaurite le risorse (ad esempio, lo spazio di archiviazione o le maniglie) |
ore 02:00 |
se non si tratta di un errore, ma di una situazione temporanea (ad esempio una regione bloccata nel file) che può essere prevista per la fine |
ore 03:00 |
se problema di autorizzazione |
ore 04:00 |
se errore interno nel software di sistema |
ore 05:00 |
in caso di guasto hardware |
ore 06:00 |
se il guasto del software di sistema non è colpa del processo attivo (ad esempio file di configurazione mancanti) |
ore 07:00 |
se errore del programma applicativo |
ore 08:00 |
se il file o l'elemento non è stato trovato |
ore 09:00 |
se il file o l'elemento è di tipo o formato non valido |
0AH (10) |
se il file o l'elemento è bloccato |
0BH (11) |
se il disco è sbagliato nell'unità, punto danneggiato sul disco o problema con il supporto di memorizzazione |
0CH (12) |
se l'articolo esiste già |
0D (13) |
errore sconosciuto |
BL = azione consigliata
01H |
Riprova un numero ragionevole di volte, quindi chiedi all'utente di selezionare Annulla o Ignora |
ore 02:00 |
riprova un numero ragionevole di volte con un ritardo tra i tentativi, quindi chiedi all'utente di selezionare annulla o ignora |
ore 03:00 |
ottenere informazioni corrette dall'utente (in genere a causa di un nome file o di una specifica del dispositivo errati) |
ore 04:00 |
interrompere l'applicazione con la pulizia (vale a dire, terminare il programma nel modo più ordinato possibile: rilasciando i blocchi, chiudendo i file, ecc.) |
ore 05:00 |
eseguire l'uscita immediata senza pulizia |
ore 06:00 |
ignorare l'errore |
ore 07:00 |
riprova dopo l'intervento dell'utente per rimuovere la causa dell'errore |
CH = luogo dell'errore
01H sconosciuto
Dispositivo a blocchi 02H (disco o emulatore di disco)
Rete 03H
Dispositivo seriale 04H
Memoria 05H
ES: DI = etichetta del volume ASCIIZ del disco
inserisci, se AX = 0022H (cambio disco non valido)
Commenti:
Questa funzione ottiene informazioni dettagliate sugli errori dopo una precedente chiamata alla funzione INT 21H non riuscita, inclusa l'azione correttiva consigliata.
INTERNO 21H (0x21)
Funzione 5AH (0x5A o 90) --> Crea file temporaneo
Chiama con: AH = 5AH
CX = attributo (i bit possono essere combinati)
DS: DX = segmento: offset del percorso ASCIIZ
Restituisce: se la funzione ha esito positivo
Porta bandiera = libera
AX = maniglia
DS: DX = segmento: offset dell'ASCIIZ completo
nome del percorso
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione crea un file con un nome univoco, nella directory corrente o specificata sul disco rigido predefinito o specificato, e restituisce un handle che può essere utilizzato dal programma per l'accesso successivo al file. Il nome generato per il file viene restituito anche in un buffer specificato dal programma.
Se un elemento del percorso non esiste o il file viene creato nella directory radice e la directory radice è piena, la funzione fallisce.
INTERNO 21H (0x21)
Funzione 5BH (0x5B o 91) --> Crea nuovo file
Chiama con: AH = 5BH
CX = attributo (i bit possono essere combinati)
DS: DX = segmento: offset del percorso ASCIIZ
Restituisce: se la funzione ha esito positivo
Porta bandiera = libera
AX = maniglia
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione crea un file nella directory designata o predefinita sull'unità designata o predefinita e restituisce un handle che può essere utilizzato dal programma per l'accesso successivo al file per un dato percorso ASCIIZ.
Se esiste già un file con lo stesso nome e percorso o un elemento del percorso specificato non esiste o il file viene creato nella directory radice e la directory radice è piena o l'utente non ha diritti di accesso sufficienti, la funzione fallisce.
INTERNO 21H (0x21)
Funzione 5CH (0x5C o 92) --> Blocca o sblocca la regione del file
Chiama con: AH = 5CH
AL = 00H se regione di blocco
01H se si sblocca la regione
BX = maniglia
CX = offset della parte alta della regione
DX = offset della parte bassa della regione
SI = parte alta della lunghezza della regione
DI = parte bassa della lunghezza della regione
Restituisce: se la funzione ha successo
Porta bandiera = libera
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione blocca o sblocca la regione specificata di un file. Questa funzione non è disponibile a meno che non sia caricato il modulo di condivisione file (ad esempio SHARE.EXE).
INTERNO 21H (0x21)
Funzione 5DH (0x5D o 93) --> Riservato
INTERNO 21H (0x21)
Funzione 5EH (0x5E o 94), sottofunzione 00H (0x00) --> Ottieni il nome della macchina
Chiama con: AH = 5EH
AL = 00H
DS: DX = segmento: offset del buffer da ricevere
corda
Restituisce: se la funzione ha esito positivo
Porta bandiera = libera
CH = 00H se il nome non è definito
<> 00H se il nome è definito
CL = numero del nome netBIOS (se CH <> 0)
DX: DX = segmento: offset dell'identificatore (se CH <> 0)
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa sottofunzione restituisce l'indirizzo di una stringa ASCIIZ che identifica il computer locale. Questa chiamata di funzione è disponibile solo quando Microsoft Network è in esecuzione.
INTERNO 21H (0x21)
Funzione 5EH (0x5E o 94), sottofunzione 02H (0x02) --> Imposta stringa di configurazione stampante
Chiama con: AH = 5EH
AL = 02H
BX = indice dell'elenco di reindirizzamento
CX = lunghezza della stringa di installazione
DS: SI = segmento: offset della stringa di impostazione
Restituisce: se la funzione ha successo
Porta bandiera = libera
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa sottofunzione specifica una stringa da inviare prima di tutti i file indirizzati a una particolare stampante di rete, consentendo agli utenti di diversi nodi di rete di specificare modalità operative personalizzate sulla stessa stampante.
INTERNO 21H (0x21)
Funzione 5EH (0x5E o 94), sottofunzione 03H (0x03) --> Ottieni stringa di configurazione della stampante
Chiama con: AH = 5EH
AL = 03H
BX = indice dell'elenco di reindirizzamento
ES: DI = segmento: offset del buffer da ricevere
stringa di configurazione
Restituisce: se la funzione ha successo
Porta bandiera = libera
CX = lunghezza della stringa di configurazione della stampante
ES: DI = segmento: offset del buffer da ricevere
stringa di configurazione
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione viene utilizzata per ottenere la stringa di configurazione della stampante per una particolare stampante di rete.
INTERNO 21H (0x21)
Funzione 5FH (0x5F o 95), sottofunzione 02H (0x02) --> Ottieni la voce dell'elenco di reindirizzamento
Chiama con: AH = 5FH
AL = 02H
BX = indice dell'elenco di reindirizzamento
DS: SI = segmento: offset del buffer da 16 byte a
ricevere il nome del dispositivo locale
ES: DI = segmento: offset del buffer da 128 byte a
ricevere il nome della rete
Restituisce: se la funzione ha successo
Porta bandiera = libera
BH = flag di stato del dispositivo
Bit 0 = 0 se il dispositivo è valido
= 1 se non valido
BL = tipo di dispositivo
03H, se la stampante
04H, se si guida
CX = valore del parametro memorizzato
DX = distrutto
BP = distrutto
DS: SI = segmento: offset del locale ASCIIZ
nome del dispositivo
ES: DI = segmento: offset della rete ASCIIZ
nome
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa sottofunzione consente l'ispezione dell'elenco di reindirizzamento del sistema, che associa nomi logici locali a file di rete, directory o stampanti. Questa chiamata di funzione è disponibile solo quando Microsoft Networks è in esecuzione e il modulo di condivisione file è stato caricato.
INTERNO 21H (0x21)
Funzione 5FH (0x5F o 95), sottofunzione 03H (0x03) --> Reindirizza dispositivo
Chiama con: AH = 5FH
AL = 03H
BL = tipo di dispositivo
03H, se la stampante
04H, se si guida
DS: SI = segmento: offset del locale ASCIIZ
nome del dispositivo
ES: DI = segmento: offset della rete ASCIIZ
nome, seguito da password ASCIIZ
Restituisce: se la funzione ha successo
Porta bandiera = libera
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Stabilisce il reindirizzamento attraverso la rete associando un nome di dispositivo locale a un nome di rete. Questa chiamata di funzione è disponibile solo quando Microsoft Networks è in esecuzione e il modulo di condivisione file (SHARE.EXE) è stato caricato.
INTERNO 21H (0x21)
Funzione 5FH (0x5F o 95), sottofunzione 04H (0x04) --> Annulla reindirizzamento dispositivo
Chiama con: AH = 5FH
AL = 04H
DS: SI = segmento: offset del locale ASCIIZ
nome del dispositivo
Restituisce: se la funzione ha successo
Porta bandiera = libera
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa sottofunzione annulla una precedente richiesta di reindirizzamento rimuovendo l'associazione di un nome di dispositivo locale con un nome di rete. Questa chiamata di funzione è disponibile solo quando Microsoft Networks è in esecuzione e il modulo di condivisione file come SHARE.EXE è stato caricato.
INTERNO 21H (0x21)
Funzione 60H (0x60 o 96) --> Riservato
INTERNO 21H (0x21)
Funzione 61H (0x61 o 97) --> Riservato
INTERNO 21H (0x21)
Funzione 62H (0x62 o 98) --> Ottieni l'indirizzo del prefisso del segmento di programma (PSP)
Chiama con: AH = 62H
Restituisce: BX = indirizzo del segmento del programma
prefisso
Commenti:
Questa funzione ottiene l'indirizzo del segmento (paragrafo) del prefisso del segmento di programma (PSP) per il programma attualmente in esecuzione.
INTERNO 21H (0x21)
Funzione 64H (0x64 o 100) --> Riservato
INT 21H
Funzione 65H (0x65 o 101) --> Ottieni informazioni estese sul paese
Chiama con: AH = 65H
AL = sottofunzione
00H = Ottieni informazioni generali
Informazioni sull'internazionalizzazione
02H = Ottieni il puntatore a maiuscolo
Tavolo
04H = Ottieni il puntatore al nome del file
Tabella maiuscola
06H = Ottieni il puntatore alla tabella di collazione
07H = Ottieni il puntatore a doppio byte
Vettore del set di caratteri (DBCS)
BX = pagina di codice di interesse (-1 = attiva
Dispositivo CON)
CX = lunghezza del buffer da ricevere
informazioni (devono essere >=5)
DX = ID paese (-1 = predefinito)
ES: DI = indirizzo del buffer da ricevere
informazioni
Restituisce: se la funzione ha successo
Porta bandiera = libera
E i dati richiesti vengono inseriti nel buffer del programma chiamante
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questo ottiene informazioni sul paese specificato e/o sulla pagina di codice. Fare riferimento alla tabella di internazionalizzazione fornita in precedenza per conoscere i byte di informazione.
INTERNO 21H (0x21)
Funzione 66H (0x66 o 102) --> Ottieni o imposta la pagina di codice
Chiama con: AH = 66H
AL = sottofunzione
01H = Ottieni la pagina del codice
02H = Seleziona la pagina codice
BX = pagina di codice da selezionare, se AL = 02H
Restituisce: se la funzione ha esito positivo
Porta bandiera = libera
E, se chiamato con AL = 01H
BX = pagina codice attiva
DX = pagina codice predefinita
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione ottiene o seleziona la code page corrente.
INTERNO 21H (0x21)
Funzione 67H (0x67 o 103) --> Imposta il conteggio degli handle
Chiama con: AH = 67H
BX = numero di maniglie desiderate
Restituisce: se la funzione ha esito positivo
Porta bandiera = libera
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione imposta il numero massimo di file e dispositivi che possono essere aperti simultaneamente utilizzando gli handle dal processo corrente.
INTERNO 21H (0x21)
Funzione 68H (0x68 o 104) --> Commit file
Chiama con: AH = 68H
BX = maniglia
Restituisce: se la funzione ha successo
Porta bandiera = libera
Se la funzione non riesce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione forza tutti i dati nei buffer interni di MS DOS associati a un handle specificato a essere scritti fisicamente sul dispositivo. Se l'handle fa riferimento a un file e il file è stato modificato, il timestamp e la data e la dimensione del file nella voce della directory radice del file vengono aggiornati.
INTERNO 21H (0x21)
Funzione 69H (0x69 o 105) --> Riservato
INTERNO 21H (0x21)
Funzione 6AH (0x6A o 106) --> Riservato
INTERNO 21H (0x21)
Funzione 6BH (0x6B o 107) --> Riservato
INTERNO 21H (0x21)
Funzione 6CH (0x6C o 108) --> File aperto esteso
Chiamata da: AH = 6CH
AL = 00N
BX = modalità aperta
Pagina/e |
Senso |
0-2 |
Tipo di accesso
000 = Sola lettura
001 = Sola scrittura
010 = Lettura/scrittura |
3 |
Riservato (0) |
4-6 |
Modalità pubblica
000 = Compatibilità
001 = Nega lettura/scrittura (nega tutto)
010 = Nega scrittura
011 = Nega lettura
100 = Non negare nulla |
7 |
Ereditarietà
0 = il processo figlio eredita l'handle
1 = il processo figlio non eredita l'handle |
8-12 |
Riservato (0) |
13 |
Gestione degli errori critici
0 = Esegui INT 24H
1 = Restituisci l'errore al processo |
14 |
Write-through
0 = le scritture possono essere bufferizzate e differite
1 = scritture fisiche al momento della richiesta |
15 |
Riservato (0) |
CX = attributo file (i bit possono essere combinati;
se ignorato, se aperto, fare riferimento alla tabella di significatività dei bit .
DX = bandiera aperta
Pagina/e |
Senso |
0-3 |
Azione se il file esiste
0000 = errore
0001 = apri file
0010 = sostituisci file |
4-7 |
Azione se il file non esiste
0000 = errore
0001 = crea file |
8-15 |
Riservato (0) |
DS:SI = segmento:offset del percorso ASCIIZ
Restituisce: mSe la funzione ha esito positivo
Porta bandiera = libera
AXE = manico
CX = azione intrapresa
1 = il file esisteva ed era
aperto
2 = il file non esiste e
è stato creato
3 = il file esisteva ed era
sostituito
Se la funzione fallisce
Porta bandiera = impostato
AX = codice di errore
Commenti:
Questa funzione apre, crea o sostituisce un file nella directory specificata o predefinita sull'unità specificata o predefinita per il percorso ASCIIZ specificato e restituisce un handle che il programma può utilizzare per accedere successivamente al file.
Se un elemento del percorso non esiste, oppure il file viene creato nella directory radice e questa è piena, oppure il file viene creato e nella directory specificata esiste già un file con lo stesso nome e l'attributo di sola lettura, oppure l'utente non dispone di diritti di accesso sufficienti, la funzione fallisce.