Capitolo – 6
Introduzione ai fondamenti del computer
introduzione
A volte, in alcuni casi, quando si sta tentando di recuperare i dati o si sta eseguendo qualsiasi attività di risoluzione dei problemi dei dati e del disco (o potrebbe essere qualsiasi altra attività relativa al sistema), è molto conveniente utilizzare il comando DEBUG di DOC.
Inoltre potrebbe essere possibile per alcuni casi particolari che ritieni sia facile svolgere quel particolare compito con l'aiuto di DEBUG e poi con la programmazione. Facciamo un esempio. La seguente codifica di debug sarà sufficiente per eseguire il backup di DBR. Basta digitare le seguenti righe:
DEBUG BKDBR.BIN
L 100 2 0 1
R CX
200
W
Q
Qui puoi vedere che solo digitando le poche righe sopra puoi evitare di scrivere un programma. Vediamo un altro esempio di codifica che carica la copia di backup di DBR sul disco
Ricorda sempre! Non provare questo senza la completa conoscenza. Assicurati di quello che farai. Un uso incauto delle seguenti Istruzioni può causare una grande perdita di dati poiché l'uso improprio delle Istruzioni potrebbe rendere inaccessibili tutte le tue informazioni sul disco.
DEBUG BKDBR.BIN
W 100 2 0 1
Q
Vedendo la codifica di questo esempio puoi facilmente intuire quanto può aiutarti quando ne hai più bisogno. Inoltre non è possibile effettuare la programmazione in ogni situazione. Tuttavia entro un limite di casi semplici del problema, utilizzare le Istruzioni di montaggio, devi semplicemente copiare debug.exe/debug.com nel tuo disco di avvio e iniziare a scrivere il codice.
Il funzionamento e gli esempi descritti in questo capitolo e in questo libro sono compatibili solo con l'architettura della famiglia di processori Intel x86.
Prima di tutto dobbiamo acquisire un po' di conoscenza delle basi dell'architettura del computer per comprendere i termini usati nelle prossime sezioni mentre descriviamo il funzionamento e gli esempi nei diversi passaggi. Facci sapere alcune nozioni di base sull'architettura del computer:
Concetti basilari
Processore centrale
Questa parte è anche nota come unità di elaborazione centrale o CPU, che a sua volta è composta dall'unità di controllo e dall'unità aritmetica e logica. Le sue funzioni consistono nel leggere e scrivere il contenuto delle celle di memoria, inoltrare dati tra celle di memoria e registri speciali, decodificare ed eseguire le Istruzioni di un programma. Il processore ha una serie di celle di memoria che vengono utilizzate molto spesso e quindi fanno parte della CPU.
Queste celle sono conosciute con il nome di registri. Un processore può avere una o due dozzine di questi registri. L'unità aritmetica e logica della CPU realizza le operazioni relative ai calcoli numerici e simbolici.
In genere queste unità hanno solo la capacità di eseguire operazioni molto elementari come l'addizione e la sottrazione di due numeri interi, la moltiplicazione e la divisione di numeri interi, la gestione dei bit dei registri e il confronto del contenuto di due registri. I personal computer possono essere classificati in base alla cosiddetta dimensione della parola, ovvero la quantità di bit che il processore può gestire alla volta.
Memoria centrale
È un gruppo di celle, fabbricate con semiconduttori, utilizzate per processi generali, come l'esecuzione di programmi e la memorizzazione di informazioni per le operazioni. Ognuna di queste celle può contenere un valore numerico e hanno la proprietà di essere orientabili. Questo è che possono distinguersi l'uno dall'altro tramite un numero univoco o un indirizzo per ogni cella. Il nome generico di queste memorie è Memoria ad accesso casuale o RAM.
Il principale svantaggio di questo tipo di memoria è che i circuiti integrati perdono le informazioni che hanno immagazzinato quando il flusso di elettricità viene interrotto. Questo è stato il motivo della creazione di memorie le cui informazioni non vengono perse allo spegnimento del sistema. Queste memorie ricevono il nome di Read Only Memory o ROM.
Affinché il PC elabori le informazioni, è necessario che queste informazioni si trovino in celle speciali chiamate registri. I registri sono gruppi di 8 o 16 flip-flop.
Un flip-flop è un dispositivo in grado di memorizzare due livelli di tensione, uno basso, regolarmente di 0,5 volt, e un altro, comunemente di 5 volt. Il livello basso di energia nel flip-flop viene interpretato come disattivato o 0 e il livello alto come attivato o
- Questi stati sono generalmente conosciuti come bit, che sono la più piccola unità di informazioni in un computer.
Un gruppo di 16 bit è noto come parola; una parola può essere divisa in gruppi di 8 bit chiamati byte e i gruppi di 4 bit sono chiamati nibble.
Registri CPU
La CPU dispone di 4 registri interni, ciascuno di 16 bit. I primi quattro, AX, BX, CX e DX sono registri di uso generale e possono essere utilizzati anche come registri a 8 bit, se utilizzati in tal modo è necessario riferirsi 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:
Register |
Specific Name |
AX |
Accumulator |
BX |
Base register |
CX |
Counting register |
DX |
Data register |
DS |
Data segment register |
ES |
Extra segment register |
SS |
Battery segment register |
CS |
Code segment register |
BP |
Base pointers register |
SI |
Source index register |
DI |
Destination index register |
SP |
Battery pointer register |
IP |
Next Instruction pointer register |
F |
Flag register |
Tuttavia useremo questi registri nella programmazione degli interrupt tramite C nei prossimi capitoli in dettaglio, ma imparare le basi del linguaggio assembly qui sarà un buon ideale e ci aiuterà durante la programmazione delle operazioni del disco, ecc.
È possibile visualizzare i valori dei registri interni della CPU utilizzando il programma Debug. Per iniziare a lavorare con Debug, digita il seguente prompt sul tuo computer:
C:/>Debug <Invio>
Nella riga successiva apparirà un trattino, questo è l'indicatore di Debug, in questo momento è possibile introdurre le Istruzioni di Debug utilizzando il seguente comando:
- r <Invio>
Viene visualizzato tutto il contenuto dei registri interni della CPU. Un'alternativa alla loro visualizzazione consiste nell'usare la "r" comando utilizzando come parametro il nome del registro di cui si vuole vedere il valore. Ad esempio:
-rbx <Invio>
Questa istruzione visualizzerà solo il contenuto del registro BX e l'indicatore Debug cambia da "-" a ":"
Quando il prompt è così, è possibile modificare il valore del registro che è stato visto digitando il nuovo valore e <Invio>, oppure è possibile lasciare il vecchio valore premendo Invio senza digitare nessun altro valore.
E' possibile modificare il valore del registro flag, e usarlo come struttura di controllo nei nostri programmi come vedremo in seguito. Ogni bit del registro ha un nome e un significato speciali, il seguente elenco descrive il valore di ogni bit, acceso o spento e la sua relazione con le operazioni del processore:
Overflow
NV = there is no overflow
OV = there is an overflow
Direction
UP = forward
DN = backward
Interrupts
DI = deactivated
EI = activated
Sign
PL = positive
NG = negative
Zero
NZ = it is not zero
ZR = it is zero
Auxiliary Carry
NA = there is no auxiliary carry
AC = there is auxiliary carry
Parity
PO = uneven parity
PE = even parity
Carry
NC = there is no carry
CY = there is carry
Struttura dell'assemblatore
In linguaggio assembly le righe di codice sono composte da 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 "AGGIUNGI" è il comando da eseguire; in questo caso un'aggiunta, e "ah" così come "bh" sono i parametri.
Il nome delle Istruzioni in lingua è 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 un solo parametro.
A volte le istruzioni vengono utilizzate come segue:
AGGIUNGI 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 per programmare il nostro primo programma con l'aiuto del debug. Creeremo un programma che funzioni per illustrare ciò che abbiamo visto e ciò che faremo è aggiungere due valori che introdurremo direttamente nel programma.
Il primo passaggio è avviare il debug, questo passaggio consiste solo nel digitare debug <Enter> sul prompt del sistema operativo.
Per assemblare un programma sul Debug, il pulsante "a" viene utilizzato il comando (assembla). Quando viene utilizzato questo comando, l'indirizzo in cui si desidera che inizi l'assemblaggio può essere fornito come parametro, se il parametro viene omesso l'assemblaggio verrà avviato nella località specificata da CS:IP, solitamente 0100h, che è la località in cui i programmi con estensione .COM deve essere avviato. E sarà il posto che useremo poiché solo Debug può creare questo specifico tipo di programmi.
Anche se in questo momento non è necessario dare la "a" comandare un parametro, è consigliabile farlo per evitare problemi una volta utilizzati i registri CS:IP, quindi digitiamo:
-a0100 <Invio>
Al termine, sullo schermo apparirà qualcosa del genere: 0C1B:0100 e il cursore è posizionato a destra di questi numeri, si noti che le prime quattro cifre, nel sistema esadecimale, possono essere diverse, ma le ultime quattro deve essere 0100, poiché è l'indirizzo che abbiamo indicato come inizio. Ora possiamo introdurre le Istruzioni:
0C1B:0100 mov ax,0002; puts the 0002 value on the ax register
0C1B:0103 mov bx,0004; puts the 0004 value on the bx register
0C1B:0106 add ax,bx; the content of bx is added to the content of ax
0C1B:0108 int 20; provoques the termination of the program.
0C1B:010A
Non è necessario scrivere i commenti che vanno dopo il ";". Una volta digitato l'ultimo comando, int 20, <Enter> viene premuto senza scrivere altro, per visualizzare nuovamente il prompt del debugger.
L'ultima riga scritta non è propriamente un'istruzione assembler, invece è una chiamata per un'interruzione del sistema operativo, queste interruzioni ci fanno risparmiare una grande quantità di righe e sono molto utili per accedere alle funzioni del sistema operativo.
Per eseguire il programma che abbiamo scritto, il pulsante "g" viene utilizzato il comando e quando viene 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'aggiunta, ma c'è un modo semplice per verificarlo, usando la "r" comando del Debug possiamo vedere il contenuto di tutti i registri del processore, è sufficiente digitare:
-r <Invio>
Ogni registro con il 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 OF DB
Esiste la possibilità che i registri contengano valori diversi, ma AX e BX devono essere gli stessi, poiché sono quelli che abbiamo appena modificato.
Un altro modo per vedere i valori, mentre il programma è in esecuzione, è usare l'indirizzo dove vogliamo che l'esecuzione finisca e mostrare i valori dei registri come parametro per "g", in questo caso sarebbe : g108, questa Istruzione esegue il programma, si ferma sull'indirizzo 108 e mostra il contenuto dei registri.
È possibile eseguire un follow-up di ciò che sta accadendo nei registri utilizzando il pulsante "t" command (trace), la funzione di questo comando è di eseguire riga per riga quanto assemblato, mostrando ogni volta il contenuto dei registri.
Per uscire da Debug, usa "q" comando (chiudi).
Vantaggi dell'Assembler
Il primo motivo per lavorare con assembler è che offre l'opportunità di conoscere meglio il funzionamento del proprio PC, il che consente lo sviluppo di 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 su assembly sono più veloci e in alcuni casi sono più piccoli e hanno capacità maggiori rispetto a quelli creati con altri linguaggi.
Fammi mantenere la mia promessa!!
Nella prima parte di questo capitolo stavamo usando alcune istruzioni come esempio, per fare il backup di DBR e per caricare il backup di DBR nella sua posizione originale quando è necessario. Per prima cosa esaminiamo le Istruzioni per eseguire 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 <Inserisci>
Scrittura di 00200 byte
- D <Inserisci>
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: denominata BKDBR.BIN se non è già presente. 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 per caricare il DBR dell'unità istruita. Impariamo come? In questa Istruzione il numero 100 è l'indirizzo del buffer, dove verrà memorizzato il DBR, il successivo numero 2 viene utilizzato per il drive C(C :). I numeri di unità sono dati come segue:
Drive Letter |
Number Used |
A: |
0 |
B: |
1 |
C: |
2 |
D: |
3 |
. |
. |
. |
. |
and so on |
. |
Il numero successivo 0 è il numero del 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 viene utilizzato per indicare il numero di settori da leggere.
Qui abbiamo dato 1 perché vogliamo leggere solo un settore. Tuttavia possiamo utilizzare i numeri e le posizioni dei settori iniziali e finali in base alle nostre esigenze in diversi tipi di altre operazioni. Quindi caricherà un settore partendo dal 1° settore dell'unità C: alla locazione 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 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 nel file BKDBR.BIN. E infine usiamo l'istruzione Q per uscire dal DEBUG e tornare al prompt del DOS.
Attenzione!!! Avvertimento!!! Attenzione!!!
Si consiglia vivamente di sapere cosa e come si sta facendo nella procedura di ripristino DBR di qualsiasi disco. Se accidentalmente si memorizzano file illegali o DBR di qualsiasi altro disco, è possibile nella maggior parte dei casi che i dati completi del disco diventino inaccessibili.
quando digiti la prima Istruzione della codifica che è:
DEBUG A:\BKDBR.BIN <Invio>
Il file deve trovarsi nella posizione specificata in cui stai avviando il programma DEBUG. Ora, se viene visualizzato 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 può essere trovato o aperto dal programma DEBUG e se continui questo processo alcune informazioni spazzatura verranno scritte su DBR e renderà inaccessibile la partizione completa. |
Ora vediamo cosa abbiamo fatto nella codifica delle Istruzioni per il ripristino del DBR dal file di backup che abbiamo fatto denominato BKDBR.BIN. I comandi di DEBUG per ripristinare il backup sono i seguenti:
C:\> DEBUG A:\BKDBR.BIN <Enter>
- W 100 2 0 1 <Enter>
- Q <Enter>
|
Questa istruzione scriverà 1 settore di informazioni dal file BKDBR.BIN nell'unità floppy (a:) nella posizione di memoria 100 nel primo settore che è il settore 0 della 2a unità che è l'unità (C:).
Memorizzazione e caricamento dei programmi
Non sembrerebbe pratico digitare un intero programma ogni volta che serve, e per evitare ciò è possibile memorizzare un programma su disco, con l'enorme vantaggio che essendo già assemblato non sarà necessario eseguirlo Esegui nuovamente il debug per eseguirlo.
I passaggi per salvare un programma che è già archiviato in memoria sono:
- Ottenere la lunghezza del programma sottraendo l'indirizzo finale dall'indirizzo iniziale, naturalmente in sistema esadecimale.
- Assegna al programma un nome e un'estensione.
- Metti 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 eseguire questi passaggi. Quando il programma sarà finalmente assemblato, apparirà così:
0C1B:0100 mov ax,0002
0C1B:0103 mov bx,0004
0C1B:0106 add ax,bx
0C1B:0108 int 20
0C1B:010 A
-h 10a 100
020a 000a
-n test.com
-rcx
CX 0000
:000a
-w
Scrittura di 000 A byte
Per ottenere la lunghezza di un programma la "h" viene utilizzato il comando, poiché ci mostrerà l'addizione e la sottrazione di due numeri in esadecimale. Per ottenere la nostra lunghezza, 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.
Le "n" comando ci permette di nominare il programma. Il "rcx" Il comando ci permette di modificare il contenuto del registro CX al valore che abbiamo ottenuto dalla dimensione del file con "h", in questo caso 000a, in quanto risultato della sottrazione dell'indirizzo finale dall'indirizzo iniziale.
Infine, il "w" comando scrive il nostro programma sul disco, indicando quanti byte ha scritto. Inoltre, per salvare un file già caricato sono necessari due passaggi:
- Assegna il nome del file da caricare.
- Caricalo usando "l" comando (carica).
Per ottenere il corretto risultato dei seguenti passaggi, è necessario che il programma di cui sopra sia già stato creato.
All'interno di Debug scriviamo quanto segue:
-n test.com
-l
-u 100 109
0C3D:0100 B80200 MOV AX,0002
0C3D:0103 BB0400 MOV BX,0004
0C3D:0106 01D8 ADD AX,BX
0C3D:0108 CD20 INT 20
L'ultimo "u" comando viene utilizzato per verificare che il programma sia stato caricato in memoria. Quello che fa è che smonta il codice e lo mostra smontato. I parametri indicano al DEBUG da dove e dove smontare. 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 64kb.
Il motivo 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, quindi creiamo ogni indirizzo di uno specifico slot 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 che corrisponde 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 usando 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'assemblatore regola la dimensione dei segmenti prendendo come base il numero di byte di cui ha bisogno ogni istruzione assemblata, poiché sarebbe uno spreco di memoria utilizzare i segmenti interi. Ad esempio, se un programma ha bisogno solo di 10kb per memorizzare i dati, il segmento di dati sarà solo di 10kb e non i 64kb che può gestire.
Movimento dei dati
Per tua conoscenza e comodità, sto elencando qui alcune istruzioni in linguaggio assembly per le operazioni sui dati, quando faremo la programmazione con l'aiuto di interrupt e altre operazioni del 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'assemblaggio sia necessaria per procedere negli altri importanti capitoli di programmazione, tuttavia, se hai difficoltà a comprendere tutte le Istruzioni, non devi preoccuparti ma ti consigliamo di 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. può copiare i dati in memoria in qualche registro, da registro a registro, da un registro a uno stack, da uno stack a un registro, per trasmettere dati a dispositivi esterni e viceversa.
Questo movimento di dati è soggetto a regole e restrizioni. Di seguito sono riportati alcuni di essi:
- Non è possibile spostare direttamente i dati da una posizione di memoria a un'altra. È necessario spostare prima i dati della località 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 deve essere spostato in un registro nella CPU.
- È possibile spostare i blocchi 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 delle strutture dette batterie, dove i dati vengono introdotti con l'istruzione push e vengono estratti con l'istruzione pop. In uno stack il primo dato da inserire è l'ultimo che possiamo prendere, se nel nostro programma utilizziamo queste Istruzioni:
PUSH AX
PUSH BX
PUSH CX
Per restituire ad ogni registro i valori corretti al momento del prelievo dallo stack è necessario farlo nel seguente ordine:
POP CX
POP BX
POP AX
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 AX,DX
Dove AX è il registro in cui verranno conservate le informazioni in entrata e DX contiene l'indirizzo della porta da cui arriveranno le informazioni.
Istruzioni MOV
Utilizzato per il trasferimento di 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 riportata di seguito:
S. No. |
Destination |
Source |
1. |
memory |
accumulator |
2. |
accumulator |
memory |
3. |
segment register |
memory/register |
4 |
memory/register |
segment register |
5. |
Register |
register |
6. |
Register |
memory |
7. |
memory |
register |
8. |
Register |
immediate data |
9. |
memory |
immediate data |
Vediamo un esempio:
MOV AX,0006
MOV BX,AX
MOV AX,4C00
INT 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 di l'interruzione delle 21. Faremo una breve introduzione dell'interruzione 13H e dell'interruzione 21H più tardi.
Interruzioni
Un interrupt è una struttura hardware che fa sì che la CPU sospenda l'esecuzione, ne salvi lo stato e si trasferisca in una posizione specifica. La posizione di trasferimento specifica l'indirizzo di un programma che deve agire in risposta all'interruzione. Il programma che viene eseguito come risultato dell'interruzione è chiamato programma di gestione delle interruzioni.
Ad esempio: se DOS vuole inviare alcune informazioni al BIOS o BIOS vuole inviare alcune informazioni al sistema del computer, DOS o BIOS generano interrupt. Ogni volta che viene generato un interrupt, il computer sospende qualsiasi cosa stia facendo e si occupa prima dell'operazione che ha generato l'interruzione.
A ciascun 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 le sottofunzioni dell'interrupt 13H, le estensioni dell'interrupt 13H e dell'interrupt 21H all'interno di 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 è gestita nella loro totalità dall'hardware e non è possibile modificarle.
Un chiaro esempio di questo tipo di interruzioni è quello che attualizza il contatore dell'orologio interno del computer, l'hardware effettua la chiamata a questa interruzione più volte al secondo per mantenere l'ora sempre aggiornata.
Sebbene non possiamo gestire direttamente questa interruzione, poiché non possiamo controllare l'aggiornamento del tempo tramite software, è tuttavia possibile sfruttarne gli effetti sul computer a nostro vantaggio.
Ad esempio : per creare un orologio virtuale aggiornato continuamente dobbiamo solo scrivere un programma che legga il valore effettivo del contatore e tradurlo 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 anche generate 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 software
Le interruzioni del software possono essere attivate direttamente dall'assemblatore invocando il numero dell'interruzione desiderata con l'Istruzione INT.
L'uso delle interruzioni ci aiuta nella creazione di programmi e utilizzandoli i nostri programmi si accorciano. È più facile capirli e di solito hanno prestazioni migliori principalmente a causa delle loro dimensioni ridotte. Questo tipo di interruzioni può essere suddiviso in due categorie: le interruzioni DOS del sistema operativo e le interruzioni 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 utilizzano il BIOS per raggiungere il loro obiettivo, d'altra parte le interruzioni del BIOS sono molto più veloci ma hanno il svantaggio che poiché fanno parte dell'hardware, sono molto specifici e possono variare a seconda anche della marca del produttore del circuito.
La scelta del tipo di interruzione da utilizzare dipenderà esclusivamente dalle caratteristiche che vuoi dare al tuo programma.
Dato che utilizzeremo gli interrupt per la programmazione del recupero dati con l'aiuto del linguaggio C tramite Gestione degli interrupt con C, discuteremo solo di Interrupt 13H, Interrupt 13H Extensions > e Interrompi specialmente le routine 21H. 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 è indispensabile, 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 il processo
Chiama con: CS = indirizzo del segmento del prefisso del segmento del programma
Resi: niente
Commenti:
Termina il processo in corso. Questo è uno dei numerosi metodi che un programma può utilizzare per eseguire un'uscita finale. Puoi anche utilizzare le funzioni (00H o 31H o 4CH) di INT 21H o semplicemente INT 27H per eseguire un'uscita finale in cui le funzioni 31H e 4CH di INT 21H sono generalmente preferite perché consentono di passare un codice di ritorno al processo padre.
Si raccomanda che se hai usato File Control Blocks (FCB) per scrivere qualsiasi file, dovresti prima chiudere il file altrimenti potresti perdere i dati perché nell'azione finale esci tutta la memoria che è stata occupata dal processo viene rilasciato, i buffer dei file vengono svuotati e tutti gli handle aperti per i file o i dispositivi di proprietà del processo vengono chiusi.
Quindi se hai degli handle aperti per i file potresti perdere i dati.
INT 21H (0x21)
Funzione 00H (0x00) --> Termina il processo
Chiama con: AH = 00H
CS = indirizzo del segmento del prefisso del segmento del programma
Resi: niente
Commenti:
Questo interrupt termina il processo corrente. Questo è uno dei numerosi metodi che un programma può utilizzare per eseguire un'uscita finale. Per ulteriori informazioni, vedere INT 20H
INT 21H (0x21)
Funzione 01H (0x01) --> Immissione di caratteri con eco
Chiama con: AH = 01H
Restituisce: AL = dati di input a 8 bit
Commenti:
Questo interrupt legge un carattere dal dispositivo di input standard come la tastiera e ne fa eco al dispositivo di output standard. Se nessun personaggio è pronto, aspetta finché non ne è disponibile uno.
INT 21H (0x21)
Funzione 02H (0x02) --> Output caratteri
Chiama con: AH = 02H
DL = dati a 8 bit per l'output
Resi: niente
Commenti:
Invia un carattere al dispositivo di output standard. L'output può essere reindirizzato. Se l'output viene reindirizzato, non è possibile rilevare il disco pieno.
Le stringhe possono anche essere inviate stringhe al display eseguendo una scrittura (INT 21H, Funzione 40H) utilizzando l'handle predefinito per lo standard output (0001H), se l'output non è stato reindirizzato, oppure un handle ha ottenuto il dispositivo logico CON .
INT 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. L'impostazione predefinita è la prima porta seriale (COM1).
Se il dispositivo ausiliario invia i dati più velocemente di quanto il tuo 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.
INT 21H (0x21)
Funzione 04H (0x04) --> Uscita ausiliaria
Chiama con: AH = 04H
DL = dati a 8 bit per l'output
Resi: niente
Commenti:
Questa funzione di INT 21H emette un carattere al dispositivo ausiliario standard. L'impostazione predefinita è la prima porta seriale (COM1). Le stringhe possono essere inviate al dispositivo ausiliario anche eseguendo una scrittura (INT 21H Function 40H) utilizzando l'handle predefinito per il dispositivo ausiliario standard (00034) oppure utilizzando un handle ottenuto aprendo il dispositivo logico AUX.
INT 21H (0x21)
Funzione 05H (0x05) --> Output della stampante
Chiama con: AH = 05H
DL = dati a 8 bit per l'output
Resi: Niente
Commenti:
Questa funzione invia un carattere al dispositivo elenco standard. Il dispositivo predefinito è la stampante sulla prima porta parallela (LPT1). Le stringhe possono essere inviate alla stampante anche eseguendo una scrittura (INT 21H Function 40H) utilizzando l'handle predefinito per il dispositivo stampante standard (0004H) oppure utilizzando un handle ottenuto aprendo il dispositivo logico PRN o LPT1.
INT 21H (0x21)
Funzione 06H (0x06) --> I/O console diretto
Call with: AH = 06H
DL = function requested such that,
If output request, 00H-FEH
If input request, 0FFH
Returns: Nothing, If called with DL = 00H-0FEH
If called with DL = FFH and a character is ready
Zero flag = clear
AL = 8-bit input data
If called with DL = FFH and no character is ready
Zero flag = set
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 è possibile rilevare EOF o disco pieno. Questa funzione di INT 21H è utilizzata da programmi che necessitano di leggere e scrivere tutti i possibili caratteri e codici di controllo senza alcuna interferenza da parte del sistema operativo.
INT 21H (0x21)
Funzione 07H (0x07) --> Inserimento di caratteri non filtrato
senza eco
Call with: AH = 07H
Returns: AL = 8-bit input data
Commenti:
Questa funzione legge un carattere dal dispositivo di input standard senza farne eco al dispositivo di output standard.
INT 21H (0x21)
Funzione 08H (0x08) --> Immissione di caratteri senza
eco
Call with: AH = 08H
Returns: AL = 8-bit input data
Commenti:
Questa funzione legge un carattere dal dispositivo di input standard senza farne eco al dispositivo di output standard.
INT 21H (0x21)
Funzione 09H (0x09) --> Visualizza stringa
Call with: AH = 09H
DS:DX = segment: offset of string
Returns: Nothing
Commenti:
Invia una stringa di caratteri al dispositivo di output standard. L'output può essere reindirizzato. Se l'output è stato reindirizzato, non è possibile rilevare il disco pieno. La stringa può essere inviata al display anche effettuando una scrittura (INT 21H Function 40H) utilizzando l'handle predefinito per lo standard output (0001H), se non è stato reindirizzato, oppure un handle ottenuto aprendo il dispositivo logico CON.
INT 21H (0x21)
Funzione 0AH (0x0A o 10) --> Tastiera tamponata
input
Call with: AH = 0AH
DS:DX = segment: offset of buffer
Returns: Data placed in buffer, Returns Nothing
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 ripetuti sul dispositivo di output standard. Il buffer utilizzato dalla funzione ha il seguente formato:
Byte |
Contents |
0 |
Maximum number of characters to read, set by program |
1 |
Number of characters actually read (excluding carriage return), set by MS-DOS |
2+ |
String read from keyboard or standard input, terminated by a carriage return (0DH) |
INT 21H (0x21)
Funzione 0BH (0x0B o 11) --> Controlla lo stato dell'input
Call with: AH = 0BH
Returns: AL = 00H (if no character is available)
FFH (if at least one character is available)
Commenti:
Verifica se un carattere è disponibile dal dispositivo di input standard come la tastiera. Questa funzione è equivalente a IOCTL INT 21H Funzione 44H Sottofunzione 06H.
INT 21H (0x21)
Funzione 0CH (0x0C o 12) --> Svuota il buffer di input
e quindi Input
Call with: AH = 0CH
AL = number of input to be invoked after resetting
buffer (must be 01H, 06H, 07H, 08H or 0AH)
If AL = 0AH
DS: DX = segment: offset of input buffer
Returns: If called with AL = 01H, 06H, 07H, or 08H,
AL = 8-bit input data
If called with AL= 0AH,
Nothing (data placed in 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.
INT 21H (0x21)
Funzione 0DH (0x0D o 13) -> Ripristino del disco
Chiama con: AH = 0DH
Resi:Niente
Commenti:
Questa funzione svuota tutti i buffer di file. La funzione non aggiorna la directory del disco per i file ancora aperti.
INT 21H (0x21)
Funzione 0EH (0x0E o 14) -> Seleziona disco
Chiama con: AH = 0EH
DL = codice azionamento (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à A-Z (0 = A, 1 = B, ecc.). Per unità logiche si intende il numero totale di dispositivi a blocchi come floppy disk e unità disco fisso, ecc. Generalmente una singola unità disco fisso fisica è partizionata in due o più unità logiche.
INT 21H (0x21)
Funzione 0FH (0x0F o 15) -> Apri file
Call with: AH = 0FH
S: DX = segment: offset of file control block
Returns: If function successful and file found
AL = 00H
And FCB filled in by MS-DOS is as follows:
Drive field (offset 00H) =1 for drive A, 2 for drive B, etc. Current block field (offset 0CH) = 00H
Record size field (offset 0EH) = 0080H
Size field (offset 10H) = file size from directory
Data field (offset 14H) = date stamp from directory
Time field (offset 16H) = time stamp from directory
Se la funzione non va a buon fine e il file non viene trovato
AL = 0FFH
Commenti:
Apre un file e lo rende disponibile per le successive operazioni di lettura/scrittura. Se il programma utilizzerà una dimensione del record diversa da 128 byte, dovrebbe impostare il campo della dimensione del record su FCB offset 0EH dopo che il file è stato aperto correttamente e prima di qualsiasi altra operazione sul disco.
INT 21H (0x21)
Funzione 10H (0x10 o 16) -> Chiudi il file
Call with: AH = 10H
DS: DX = segment: offset of file control block
Returns: If function successful (directory update successful)
AL = 00H
If function unsuccessful (file not found in directory)
AL = FFH
Commenti:
Serve per chiudere un file. Chiude un file, scarica su disco tutti i buffer del disco interni di MS-DOS associati al file e aggiorna la directory del disco se il file è stato modificato o esteso.
INT 21H (0x21)
Funzione 11H (0x11 o 17) -> Trova il primo file
Call with: AH = 11H
DS: DX = segment: offset of file control block
Returns: If function successful and matching file found
AL = 00H
E buffer all'indirizzo dell'area di trasferimento del disco (DTA) corrente compilato come FCB normale non aperto o FCB esteso, a seconda del tipo di FCB immesso per funzionare.
Se la funzione non riesce (nessun nome file corrispondente trovato)
AL = FFH
Commenti:
Cerca nella directory corrente sull'unità designata un nome file corrispondente. È possibile utilizzare i caratteri jolly (? e *). Questa funzione restituisce il primo nome file corrispondente.
INT 21H (0x21)
Funzione 12H (0x12 o 18) -> Trova il file successivo
Call with: AH = 12H
DS: DX = segment: offset of file control block
Returns: If function successful and matching filename found
AL = 00H
And buffer at current disk transfer area (DTA) address set up as an unopened normal FCB or extended FCB, depending on which type of FCB was originally input to INT21H function 11H
If function unsuccessful and matching filenames not found
AL = FFH
Commenti:
Questo è il compagno della funzione precedente. Se INT 21H La funzione 11H ha avuto esito positivo, restituisce il successivo nome file corrispondente, se presente. Questa funzione presuppone che l'FCB utilizzato come input sia stato inizializzato correttamente da una precedente chiamata a INT 21H Function 11H e possibili successive chiamate a INT 21H Function 12H e che il nome file o l'estensione cercati contenessero almeno un carattere jolly.
INT 21H (0x21)
Funzione 13H (0x13 o 19) -> Elimina file
Call with: AH = 13H
DS: DX = segment: offset of file control block
Returns: If function is successful and file or files deleted
AL = 00H
If function is unsuccessful and no matching files were found or at least one matching file was read-only,
AL = FFH
Commenti:
Elimina tutti i file corrispondenti dalla directory corrente sull'unità disco predefinita o specificata. Puoi anche utilizzare i caratteri jolly (? e *).
INT 21H (0x21)
Funzione 14H (0x14 o 20) -> Lettura sequenziale
Call with: AH = 14H
DS: DX = segment: offset of previously opened
file control block
Returns: AL = 00H if read successful
01H if end of file
02H if segment wrap
03H if partial record read at end of
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 della dimensione del record (offset 0EH) del blocco di controllo file (FCB).
Il record viene letto in memoria all'indirizzo dell'area di trasferimento del disco (DTA) corrente, specificato dalla chiamata più recente alla funzione INT 21H 1AH. Se la dimensione del record e la posizione del buffer sono tali da causare un overflow del segmento o un wraparound, la funzione non riesce con un codice di ritorno di 02H.
INT 21H (0x21)
Funzione 15H (0x15 o 21) --> Scrittura sequenziale
Call with: AH = 15H
DS: DX = segment: offset of previously opened file control block
Returns: AL = 00H, if write successful
01H, if disk is file
02H, if segment wrap
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 della dimensione del record (offset 0EH) del blocco di controllo file (FCB).
INT 21H (0x21)
Funzione 16H (0x16 o 22) --> Crea file
Call with: AH = 16H
DS: DX = segment: offset of unopened file control block
Returns: If function is successful and file was created or truncated
AL = 00H
And FCB filled in by MS-DOS as follows:
Drive field (offset 00H) = 1 for drive A, 2 for drive B, etc.
Current block field (offset0CH) = 00H
Record size field (offset 0EH) = 0080H
Size field (offset 10H) = file size from directory
Date field (offset 14H) = date stamp from directory
Time field (offset 16H = time stamp from directory
If function unsuccessful (directory full)
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 anche il file per le 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 vanno irrimediabilmente persi.
INT 21H (0x21)
Funzione 17H (0x17 o 23) --> Rinomina file
Call with: AH = 17H
DS: DX = segment: offset of special file control block
Returns: If function is successful and one or more files renamed
AL = 00H
If function is unsuccessful and no matching files, or new filename matched an existing file
AL = FFH
Commenti:
Questa funzione cambia il nome di tutti i file corrispondenti nella directory corrente sul disco nell'unità specificata.
Puoi anche usare i caratteri jolly con questo. Il blocco di controllo file speciale ha un codice unità, un nome file e un'estensione nella posizione normale (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
INT 21H (0x21)
Funzione 19H (0x19 o 25) --> Ottieni il disco corrente
Call with: AH = 19H
Returns: AL = drive code (0 for A drive, 1 for B drive etc.)
Commenti:
Questa funzione restituisce il codice dell'unità disco corrente o predefinita.
INT 21H (0x21)
Funzione 1AH (0x1A o 26) --> Imposta l'indirizzo DTA
Call with: AH = 1AH
DS: DX = segment: offset of disk transfer area.
Returns: Nothing
Commenti:
Questa funzione specifica l'indirizzo dell'area di trasferimento del disco (DTA) da utilizzare per le successive chiamate di funzione relative all'FCB.
INT 21H (0x21)
Funzione 1BH (0x1B o 27) --> Ottieni unità predefinita
dati
Call with: AH = 1BH
Returns: If function successful
AL = sectors per cluster
DS: DX = segment offset of media ID byte
CX = size of physical sector in bytes
DX = number of clusters for default drive
If function unsuccessful (invalid drive or critical error)
AL = FFH
Commenti:
Questa funzione ottiene le informazioni selezionate sull'unità disco predefinita e un puntatore al byte di identificazione del supporto dalla sua tabella di allocazione dei file.
Il byte dell'ID multimediale ha i seguenti significati:
Media Descriptor ID |
Medium |
0F0H |
3.5-inch Floppy Disk, double-sided, 18 sectors (or other) |
0F8H |
fixed disk |
0F9H |
5.25-inch Floppy Disk, double-sided, 15 sectors |
0F9H |
3.5-inch Floppy Disk, double-sided, 9 sectors |
0FCH |
5.25-inch Floppy Disk, single-sided, 9 sectors |
0FDH |
5.25-inch Floppy Disk, double-sided, 9 sectors |
0FDH |
8-inch Floppy Disk, single sided, single density |
0FEH |
5.25-inch Floppy Disk, single-sided, 8 sectors |
0FEH |
8-inch Floppy Disk, Single Sided, Single Density |
0FEH |
8-inch Floppy Disk, Double Sided, Double Density |
0FFH |
5.25-inch Floppy Disk, double-sided, 8 sectors |
INT 21H (0x21)
Funzione 1CH (0x1C o 28) --> Ottieni dati di guida
Call with: AH = 1CH
DL = Drive Code
Returns: If function is successful
AL = sectors per cluster
DS: BX = segment: offset of media ID byte
CX = size of physical sector in bytes
DX = number of clusters for default or specified drive
If function is unsuccessful and invalid drive or critical error
AL = FFH
Commenti:
Questa funzione ottiene le informazioni sull'allocazione sull'unità disco specificata e un puntatore al byte di identificazione del supporto dalla relativa tabella di allocazione dei file. Fare riferimento alla tabella dei byte dell'ID del descrittore del supporto, fornita in INT 21H, Funzione 1BH, per le informazioni sull'ID del supporto.
INT 21H (0x21)
Funzione 1DH (0x1D o 29) --> Riservato
INT 21H (0x21)
Funzione 1EH (0x1E o 30) --> Riservato
INT 21H (0x21)
Funzione 1FH (0x1F o 31) --> Riservato
INT 21H (0x21)
Funzione 20H (0x20 o 32) --> Riservato
INT 21H (0x21)
Funzione 21H (0x21 o 33) --> Lettura casuale
Call with: AH = 21H
DS: DX = segment: offset of previously opened
file control block
Returns: AL = 00H if read successful
01H if end of file
02H if segment wrap, read canceled
03H if partial record read at end of
file
Commenti:
Questa funzione legge un record selezionato da un file in memoria. Il record viene letto in memoria all'indirizzo dell'area di trasferimento del disco corrente, specificato dalla chiamata più recente a INT 21H Funzione 1AH.
INT 21H (0x21)
Funzione 22H (0x22 o 34) --> Scrittura casuale
Call with: AH = 22H
DS: DX = segment: offset of previously opened
file control block
Returns: AL = 00H if write successful
01H if disk full
02H if segment wrap, write canceled
Commenti:
Questa funzione scrive i dati dalla memoria in un record selezionato in un file.
INT 21H (0x21)
Funzione 23H (0x23 o 35) --> Ottieni la dimensione del file
Call with: AH = 23H
DS: DX = segment: offset of unopened file
control block
Returns: If function is successful and matching filename found
AL = 00H
And FCB relative-record field (offset 21H) set to the number of records in the file, rounded up if necessary to the next complete record
If function is unsuccessful and no matching file found
AL = FFH
Commenti:
Questa funzione ricerca 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 del record predefinita per questa funzione, quindi è necessario inserire un valore appropriato nel campo della dimensione del record FCB (offset 0EH) prima di chiamare questa funzione.
INT 21H (0x21)
Funzione 24 ore (0x24 o 36) --> Imposta record relativo
numero
Call with: AH = 24H
DS: DX = segment: offset of previously opened
file control block
Returns: AL is destroyed (other register not affected)
FCB relative-record field (offset 21H) updated
Commenti:
Questa funzione imposta il campo del numero di record relativo di un blocco di controllo file (FCB) in modo che corrisponda alla posizione del file corrente registrata nell'FCB aperto.
INT 21H (0x21)
Funzione 25H (0x25 o 37) --> Imposta vettore di interruzione
Call with: AH = 25H
AL = interrupt number
DS: DX = segment: offset of interrupt handling
routine
Returns: Nothing
Commenti:
Questa funzione inizializza un vettore di interrupt della CPU per puntare a una routine di gestione degli interrupt. Dovrebbe essere usato preferibilmente per la modifica diretta della tabella del vettore di interrupt da parte di applicazioni ben educate.
INT 21H (0x21)
Funzione 26H (0x26 o 38) --> Crea un nuovo programma
Prefisso del segmento (PSP)
Call with: AH = 26H
DX = segment: of new program segment
prefix (PSP)
Returns: Nothing
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 la nuova PSP per renderla utilizzabile da un altro programma.
INT 21H (0x21)
Funzione 27H (0x27 o 39) --> Lettura casuale del blocco
Call with: AH = 27H
CX = number of records to read
DS: DX = segment: offset of previously opened
file control block
Returns: AL = 00H if all requested records read
01H if end of file
02H if segment wrap
03H if partial record read at end of
file
CX = actual number of records read
Commenti:
Questa funzione legge uno o più record sequenziali da un file in memoria, a partire da una posizione di file designata. Se la dimensione e la posizione del buffer sono tali da causare un overflow del segmento o un wraparound, la funzione fallisce con un codice di ritorno di 02H e se viene letto un record parziale alla fine del file, il resto del record viene riempito con zeri .
INT 21H (0x21)
Funzione 28H (0x28 o 40) --> Scrittura a blocchi casuali
Call with: AH = 28H
CX = number of records to write
DS: DX = segment: offset of previously opened
file control block
Returns: AL = 00H if all requested records written
01H if disk full
02H if segment wrap
CX = actual number of records written
Commenti:
Questa funzione scrive uno o più record sequenziali dalla memoria in un file, a partire da una posizione di file designata. Se la dimensione e la posizione del buffer sono tali da causare un overflow del segmento o un wraparound, la funzione non riesce con un codice di ritorno 02H.
INT 21H (0x21)
Funzione 29H (0x29 o 41) --> Analizza il nome del file
Call with: AH = 29H
AL = flags to control parsing
Bit 0 = 1, if leading separators will be
scanned off (ignored).
= 0, if leading separators will not be
scanned off
Bit 1 = 1, if drive ID byte in FCB will be
modified only if a drive was
specified in the string being parsed.
= 0, if the drive ID byte in FCB will be
modified regardless, if no drive
specifier is present in the parsed string, FCB drive code field is set to 0 (default)
Bit 2 = 1, if filename field in FCB will be
modified only if a filename is
specified in the string being parsed.
= 0, if filename field in FCB will be modified regardless, if no filename is presenting the parsed string, FCB filename is set to ASCIIZ blanks.
Bit 3 = 1, if extension field in FCB will be
modified, only if an Extension is
specified in the string being parsed.
= 0, if extension field in FCB will be
modified regardless, if no extension
is present in the parsed string, FCB
extension is set to ASCIIZ blanks
DS: SI = segment: offset of string
ES: DI = segment: offset of file control block
Returns: AL = 00H, if no wildcard characters
Encountered 01H, if parsed string
contained wildcard characters FFH,
if drive specifier invalid
DS: SI = segment: offset of first character
after parsed filename
ES: DI = segment: offset of formatted
unopened file control block
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 .
INT 21H (0x21)
Funzione 2AH (0x2A o 42) --> Ottieni giorno e data
Call with: AH = 2AH
Returns: CX = year (1980 through 2099)
DH = month (1 through 12)
DL = day (1 through 31)
AL = day of the week (0 = Sunday,
1= Monday, etc.)
Commenti:
Questa funzione ottiene il giorno del mese, il giorno della settimana, il mese e l'anno di sistema.
INT 21H (0x21)
Funzione 2BH (0x2B o 43) --> Imposta la data
Call with: AH = 2BH
CX = year (1980 through 2099)
DH = month (1 through 12)
DL = day (1 through 31)
Returns: AL = 00H if date set successfully
FFH if date not valid (ignored)
Commenti:
Questa funzione inizializza il driver dell'orologio di sistema a una data specifica ma l'ora di sistema rimane invariata.
INT 21H (0x21)
Funzione 2CH (0x2C o 44) --> Prendi tempo
Call with: AH = 2CH
Returns: CH = hours (0 through 23)
CL = minutes (0 through 59)
DH = seconds (0 through 59)
DL = hundredths of seconds (0 through 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.
INT 21H (0x21)
Funzione 2DH (0x2D o 45) --> Imposta l'ora
Call with: AH = 2DH
CH = hours (0 through 23)
CL = minutes (0 through 59)
DH = seconds (0 through 59)
DL = hundredths of seconds (0 through 99)
Returns: AL = 00H, if time set successfully
FFH, if time not valid (ignored)
Commenti:
Questa funzione inizializza l'orologio in tempo reale del sistema su un'ora, un minuto, un secondo e un centesimo di secondo specificati. La data di sistema non è influenzata.
INT 21H (0x21)
Funzione 2EH (0x2E o 46) --> Imposta flag di verifica
Call with: AH = 2EH
AL = 00H, if turning off verify flag
01H, if turning on verify flag
DL = 00H
Resi: niente
Commenti:
Questa funzione disattiva o attiva il flag del sistema operativo per la verifica automatica della lettura dopo la scrittura dei dati. L'impostazione predefinita del flag di verifica è OFF perché la verifica di lettura dopo scrittura rallenta le operazioni del disco.
INT 21H (0x21)
Funzione 2FH (0x2F o 47) --> Ottieni l'indirizzo DTA
Call with: AH = 2FH
Returns:ES: BX = segment: offset of disk transfer area
Commenti:
Questa funzione ottiene l'indirizzo corrente dell'area di trasferimento del disco (DTA) per le operazioni di lettura/scrittura di file FCB.
INT 21H (0x21)
Funzione 30H (0x30 o 48) --> Ottieni MS-DOS
numero di versione
Call with: AH = 30H
AL = 00H
Returns: AL = major version number (MS-DOS 3.10=3, etc.)
AH = minor version number (MS-DOS 3.10= 0AH, etc.)
BH = Original Equipment Manufacturer’s
(OEM’s) serial number (OEM-dependent-usually 00H for IBM’s
PC-DOS, 0FFH or other values for MS-DOS)
BL: CX = 24-bit user serial number (optional, OEM-dependent)
Commenti:
Restituisce il numero di versione del sistema operativo MS-DOS host.
INT 21H (0x21)
Funzione 31H (0x31 o 49) --> Termina e resta
Residente (TSR)
Call with: AH = 31H
AL = return code
DX = amount of memory in paragraphs, to reserve
Returns Nothing
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 utilizzata al posto di INT 27H perché supporta CS per contenere il segmento del prefisso del segmento del programma.
INT 21H (0x21)
Funzione 32H (0x32 o 50) --> Riservato
INT 21H (0x21)
Funzione 33H (0x33 o 51) --> Ottieni o imposta flag di interruzione, ottieni Drive di avvio
Call with: If getting break flag
AH = 33H
AL = 00H
If setting break flag
AH = 33H
AL = 01H
DL = 00H if turning break flag OFF
01H if turning break flag ON
If getting boot drive
AH = 33H
AL = 05H
Returns: If called with AL = 00H or 01H
DL = 00H break flag is OFF
01H break flag is ON
If called with AL = 05H
DL = boot drive (1 = A, 2 = B, etc.)
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.
INT 21H (0x21)
Funzione 34H (0x34 o 52) --> Riservato
INT 21H (0x21)
Funzione 35H (0x35 o 53) --> Ottieni vettore di interruzione
Call with: AH = 35H
AL = interrupt number
Returns: ES: BX = segment: offset of interrupt handler
Commenti:
Questa funzione ottiene l'indirizzo della routine di gestione degli interrupt corrente per l'interrupt macchina specificato.
INT 21H (0x21)
Funzione 36H (0x36 o 54) --> Ottieni l'allocazione dell'unità
Informazioni
Call with: AH = 36H
DL = drive code (0 default, 1 = A, etc.)
Returns: If function successful
AX = sector per cluster
BX = number of available cluster
CX = bytes per sector
DX = cluster per drive
If function unsuccessful (drive invalid)
AX = FFFFH
Commenti:
Questa funzione ottiene informazioni selezionate su un'unità disco.
Questa funzione è molto importante nella programmazione del ripristino dei dati e della risoluzione dei problemi del disco da cui è possibile calcolare la capacità dell'unità e lo spazio libero rimanente e molte altre cose importanti.
INT 21H (0x21)
Funzione 37H (0x37 o 55) --> Riservato
INT 21H (0x21)
Funzione 38H (0x38 o 56) --> Ottieni o imposta il paese
informazione
Call with: If getting country information
AH = 38H
AL = 0, to get current country information
1-FEH, to get information for
countries with code <255
FFH, to get information for countries
with code >=255
BX = country code, if AL = FFH
DS:DX = segment: offset of buffer for returned information
If setting current country code
AH = 38H
AL = 1-FEH, country code for countries with code <255
FFH, for countries with code >=255
BX = country code, if AL = 0FFH
DX = FFFFH
Returns:
If function is successful
Carry flag = clear
And, if getting internationalization information
BX = country code
DS: DX = segment: offset of buffer holding internationalization Information.
If function is unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione ottiene informazioni internazionali per il paese corrente o specificato o imposta il prefisso del paese corrente.
INT 21H (0x21)
Funzione 39H (0x39 o 57) --> Crea directory
Call with: AH = 39H
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione crea una directory utilizzando l'unità e il percorso specificati.
ASCIIZ è noto come la sequenza di caratteri ASCII terminata essere, Null o Zero, Byte. |
INT 21H (0x21)
Funzione 3AH (0x3A o 58) --> Elimina directory
Call with: AH = 3AH
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione rimuove una directory utilizzando l'unità e il percorso specificati. Se un qualsiasi elemento del percorso 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.
INT 21H (0x21)
Funzione 3BH (0x3B o 59) --> Imposta corrente
directory
Call with: AH = 3BH
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione imposta la directory corrente o predefinita utilizzando l'unità e il percorso specificati. Se il percorso specificato o qualsiasi elemento del percorso non esiste, la funzione ha esito negativo.
INT 21H (0x21)
Funzione 3CH (0x3C o 60) --> Crea file
Call with: AH = 3CH
CX = file attribute, where attribute
significance bits may be Combined.
Il significato dei bit è riportato nella seguente tabella:
Bit(s) |
Significance (if set) |
0 |
Read-only |
1 |
Hidden |
2 |
System |
3 |
Volume label |
4 |
Reserved (0) |
5 |
Archive |
6 – 15 |
Reserved (0) |
DS: DX = segment: offset of ASCIIZ
pathname
Returns: If function successful
Carry flag = clear
AX = handle
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Se viene fornito un percorso 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 il successivo accesso al file.
Se un elemento del percorso non esiste o il file viene creato nella directory principale e la directory principale è piena o l'accesso è negato o un file con attributo di sola lettura è già nella directory specificata, la funzione di creazione del file non riesce .
INT 21H (0x21)
Funzione 3DH (0x3D o 61) --> Apri file
Call with: AH = 3DH
AL = access mode
Il significato dei bit della modalità di accesso è riportato nella tabella seguente:
Bits |
Significance |
0 – 2 |
Access Mode
000 = read access
001 = write access
010 = read/write access |
3 |
Reserved (0) |
4 – 6 |
Sharing Mode
000 = compatibility mode
001 = deny all
010 = deny write
011 = deny read
100 = deny none |
7 |
Inheritance flag
0 = child process inherits handle
1 = child does not inherit handle |
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function successful
Carry flag = clear
AX = handle
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Se viene fornito un percorso 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 il successivo accesso al file.
INT 21H (0x21)
Funzione 3EH (0x3E o 62) --> Chiudi il file
Call with: AH = 3EH
BX = handle
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione svuota tutti i buffer interni associati al file su disco, chiude il file e rilascia l'handle per il riutilizzo, di precedentemente aperto o creato con successo di un determinato handle. Se il file è stato modificato, l'ora e la data e la dimensione del file vengono aggiornate nella voce della directory del file.
INT 21H (0x21)
Funzione 3FH (0x3F o 63) --> Leggi file o dispositivo
Call with: AH = 3FH
BX = handle
CX = number of bytes to read
DS: DX = segment: offset of buffer
Returns: If function successful
Carry flag = clear
AX = byte transferred
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione trasferisce i dati nella posizione corrente del puntatore al file dal file al buffer e quindi aggiorna la posizione del puntatore del file per un dato handle di file valido da un'operazione di apertura o creazione precedente, un indirizzo del buffer e una lunghezza in byte .
INT 21H (0x21)
Funzione 40H (0x40 o 64) --> Scrivi file o dispositivo
Call with: AH = 40H
BX = handle
CX = number of bytes to write
DS: DX = segment: offset of buffer
Returns: If function successful
Carry flag = clear
AX = byte transferred
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione trasferisce i dati dal buffer nel file e quindi aggiorna la posizione del puntatore del file per un determinato handle di file valido da un'operazione di apertura o creazione precedente, 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.
INT 21H (0x21)
Funzione 41H (0x41 o 65) --> Elimina file
Call with: AH = 41H
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
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 principale con il carattere E5H (0xE5) e rendendo i cluster del file disponibili per i nuovi dati nella tabella di allocazione file. Fino ad allora i dati effettivi archiviati in quei cluster non vengono sovrascritti.
INT 21H (0x21)
Funzione 42H (0x42 o 66) --> Imposta il puntatore del file
Call with: AH = 42H
AL = method code
00H absolute offset from start of file
01H signed offset from current file
pointer
02H signed offset from end of file
BX = handle
CX = most significant half of offset
DX = least significant half of offset
Returns: if function is successful
Carry flag = clear
DX = most significant half of resulting file
pointer
AX = least significant half of resulting file
pointer
If function is unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione imposta la posizione del puntatore del file rispetto all'inizio, alla fine del file o alla posizione del file corrente.
INT 21H (0x21)
Funzione 43H (0x43 o 67) --> Ottieni o imposta file
attributi
Call with: AH = 43H
AL = 00H to get attributes
01H to set attributes
CX = file attribute, if AL=01H. Bits can be combined
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function successful
Carry flag = clear
CX = file attribute
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione ottiene o altera gli attributi del file (di sola lettura, nascosto, di sistema o di archivio) o della directory. Per il significato dei bit per attributi diversi, fare riferimento alla tabella di significato dei bit fornita prima.
INT 21H (0x21)
Funzione 44H (0x44 o 68) --> Input Output
Controllo (Ctrl I/O)
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 non supportate da altre chiamate di funzione MS-DOS.
Le sottofunzioni di Input e Output Control sono state fornite nella tabella seguente:
Sub function |
Operation Name |
00H |
Get Device Information |
01H |
Set Device Information |
02H |
Receive Control Data from Character Device Driver |
03H |
Send Control Data to Character Device Driver |
04H |
Receive Control Data from Block Device Driver |
05H |
Send Control Data to Block Device Driver |
06H |
Check Input Status |
07H |
Check Output Status |
08H |
Check If Block Device Is Removable |
09H |
Check If Block Device Is Remote |
0AH (10) |
Check If Handle Is Remote |
0BH (11) |
Change Sharing Retry Count |
0CH (12)
|
Generic I/O Control for Character Devices
Value |
Description |
CL = 45H |
Set Iteration Count |
CL = 4AH |
Select Code Page |
CL = 4CH |
Start Code Page Preparation |
CL = 4DH |
End Code Page Preparation |
CL = 5FH |
Set Display Information |
CL = 65H |
Get Iteration Count |
CL = 6AH |
Query Selected Code Page |
CL = 6BH |
Query Prepare List |
CL = 7FH |
Get Display Information |
|
0DH (13)
|
Generic I/O Control for Block Devices
Value |
Description |
CL = 40H |
Set Device Parameters |
CL = 41H |
Write Track |
CL = 42H |
Format and Verify Track |
CL = 47H |
Set Access Flag |
CL = 60H |
Get Device Parameters |
CL = 61H |
Read Track |
CL = 62H |
Verify Track |
CL = 67H |
Get Access Flag |
|
0EH (14) |
Get Logical Drive Map |
0FH (15) |
Set Logical Drive Map |
INT 21H (0x21)
Funzione 44H (0x44 o 68), sottofunzione 00H (0x00)
Ctrl I/O --> ottenere informazioni sul dispositivo
Call with: AH = 44H
AL = 00H
BX = handle
Returns: If function successful
Carry flag = clear
DX = device information word
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione secondaria restituisce una parola di informazioni sul dispositivo per il file o il dispositivo associato all'handle specificato.
INT 21H (0x21)
Funzione 44H (0x44 o 68), sottofunzione 01H (0x01)
Ctrl I/O --> impostare le informazioni sul dispositivo
Call with: AH = 44H
AL = 01H
BX = handle
DX = device information word
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa sottofunzione della funzione 44H di INT 21H, imposta alcuni flag per un handle associato a un dispositivo di caratteri. Questa funzione secondaria non può essere utilizzata per un handle associato a un file.
INT 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 02H (0x02)
Ctrl I/O --> leggere il dispositivo di caratteri dei dati di controllo
conducente
Call with: AH = 44H
AL = 02H
BX = handle
CX = number of bytes to read
DS: DX = segment: offset of buffer
Returns: If function is successful
Carry flag = clear
AX = bytes read
And buffer contains control data from driver
If function is unsuccessful
Carry flag = set
AX = error code
Commenti:
Legge i dati di controllo da un driver del dispositivo a caratteri. La lunghezza e il contenuto dei dati sono specificati per ciascun driver di dispositivo e non seguono alcun formato standard. Questa funzione non comporta necessariamente alcun input dal dispositivo fisico.
INT 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 03H (0x03)
Ctrl I/O --> scrivere dati di controllo dispositivo-carattere
conducente
Call with: AH = 44H
AL = 03H
BX = handle
CX = number of bytes to write
DS: DX = segment: offset of data
Returns: If function successful
Carry flag = clear
AX = bytes transferred
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione secondaria 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 ciascun driver di dispositivo e non seguono alcun formato standard. Questa funzione non risulta necessariamente in caso di output sul dispositivo fisico.
INT 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 04H (0x04)
Ctrl I/O --> Leggi il driver del dispositivo di blocco dei dati di controllo
Call with: AH = 44H
AL = 04H
BL = device code (0= default, 1=A, 2=B, etc.)
CX = number of bytes to read
DS: DX = segment: offset of buffer
Returns: If function successful
Carry flag = clear
AX = bytes transferred
And buffer contains control data from device driver
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione secondaria 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 ciascun driver di dispositivo e non seguono alcun formato standard. Questa funzione non comporta necessariamente l'input dal dispositivo fisico.
INT 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 05H (0x05)
Ctrl I/O --> scrivi il driver del dispositivo blocco dati di controllo
Call with: AH = 44H
AL = 05H
BL = device code (0= default, 1=A, 2=B, etc.)
CX = number of bytes to write
DS: DX = segment: offset of data
Returns: If function successful
Carry flag = clear
AX = bytes transferred
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione secondaria 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 ciascun driver di dispositivo e non seguono alcun formato standard. Questa funzione non genera necessariamente alcun output sul dispositivo fisico.
INT 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 06H (0x06)
Ctrl I/O --> controlla lo stato dell'input
Call with: AH = 44H
AL = 06H
BX = handle
Returns: If function successful
Carry flag = clear
And for a device:
AL = 00H, if device not ready
FFH, if device ready
For a file:
AL = 00H, if file pointer at EOF
FFH, if file pointer not at EOF
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Restituisce un codice che indica se il dispositivo o i file associati a un handle sono pronti per l'input.
INT 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 07H (0x07)
Ctrl I/O --> controlla lo stato dell'uscita
Call with: AH = 44H
AL = 07H
BX = handle
Returns: If function successful
Carry flag = clear
And for a device:
AL = 00H, if device not ready
FFH, if device ready
For a file:
AL = FFH
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Restituisce un codice che indica se il dispositivo associato a un handle è pronto per l'output.
INT 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 08H (0x08)
Ctrl I/O --> controlla se il dispositivo a blocchi è rimovibile
Call with: AH = 44H
AL = 08H
BL = drive number (0 = default, 1=A, 2=B, etc.)
Returns: If function successful
Carry flag = clear
AL = 00H, if medium is removable
01H, if medium is not removable
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione secondaria verifica se il dispositivo a blocchi specificato contiene un supporto di memorizzazione rimovibile, ad esempio un floppy disk. Se un file non viene trovato come previsto su una particolare unità, un programma può utilizzare questa funzione secondaria per determinare se all'utente deve essere richiesto di inserire un altro disco.
INT 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 09H (0x09)
Ctrl I/O --> controlla se il dispositivo di blocco è remoto
Call with: AH = 44H
AL = 09H
BL = drive number (0 = default, 1=A, 2=B, etc.)
Returns: If function successful
Carry flag = clear
DX = device attribute word
bit 12 = 0, if drive is local
= 1, if drive is remote
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione secondaria controlla se il dispositivo a blocchi specificato è locale (collegato al computer che esegue il programma) o remoto (reindirizzato a un server di rete).
INT 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 0AH (0x0A o 10) I/O Ctrl --> controlla se l'handle è remoto
Call with: AH = 44H
AL = 0AH
BX = handle
Returns: If function successful
Carry flag = clear
DX = attribute word for file or device
bit 15 = 0 if local
1 if remote
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Verifica se l'handle specificato fa riferimento a un file o dispositivo locale (posizionato sul PC su cui è in esecuzione il programma) o remoto (posizionato su un server di rete).
INT 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 0BH (0x0B o 11) I/O Ctrl --> modifica il conteggio dei tentativi di condivisione
Call with: AH = 44H
AL = 0BH
CX = delays per retry (default = 1)
DX = number of retries (default = 3)
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione secondaria imposta il numero di volte in cui MS-DOS ritenta un'operazione su disco dopo un errore causato da una violazione di condivisione file prima che restituisca un errore al processo richiedente. Questa funzione secondaria non è disponibile a meno che non venga caricato il modulo di condivisione file.
INT 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 0CH (0x0C o 12) I/O Ctrl controllo I/O generico per
dispositivi dei personaggi
Call with: AH = 44H
AL = 0CH
BX = handle
CH =codice categoria (principale):
00H = unknown
01H = COM1, COM2, COM3,OR COM4
03H = CON (keyboard and display)
05H = LPT1, LPT2, OR LPT3
CL = codice funzione (minore):
45H = Set Iteration Count
4AH = Select Code Page
4CH = Start Code Page Preparation
4DH = End Code Page Preparation
5FH = Set Display Information
65H = Get Iteration Count
6AH = Query Selected Code Page
6BH = Query Prepare List
7FH = Get Display Information
DS: DX = segment: offset of parameter block
Returns: If function successful
Carry flag = clear
And if called with CL = 65H, 6AH, 6BH or 7FH
DS: DX = segment: offset of parameter block
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Fornisce un meccanismo generico per la comunicazione tra i programmi applicativi ei driver del dispositivo a caratteri.
INT 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 0DH (0x0D o 13) I/O Ctrl --> controllo I/O generico per blocco
dispositivi
Call with: AH = 44H
AL = 0DH
BL = drive code (0 =default, 1=A, 2=B, etc.)
CH = category (major) code:
08H = disk drive
CL = function (minor) code:
40H = Set Drive Parameters
41H = Write Track
42H = Format and Verify Track
47H = Set Access Flag
60H = Get Device Parameters
61H = Read Track
62H = Verify track
67H = Get Access Flag
DS: DX = segment: offset of parameter block
Returns: If function successful
Carry flag = clear
And if called with CL = 60H or 61H
DS: DX = segment: offset of parameter block
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione secondaria fornisce un meccanismo generico 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.
INT 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 0EH (0x0E o 14) I/O Ctrl -->> ottieni la mappa dell'unità logica
Call with: AH = 44H
AL = 0EH
BL = drive code (0 = default, 1=A, 2=B, etc.)
Returns: If function successful
Carry flag = clear
AL = mapping code
00H, if only one logical drive code
assigned to the block device
01H-1AH logical drive code (1=A,
2=B, etc.) mapped to the block device
If function unsuccessful
Carry flag = set
AX =error code
Commenti:
Restituisce il codice dell'unità logica che è stato utilizzato più di recente per accedere all'unità a blocchi specificata.
INT 21H (0x21)
Funzione 44H (0x44 o 68), Sottofunzione 0FH (0x0F o 15) I/O Ctrl --> imposta la mappa dell'unità logica
Call with: AH = 44H
AL = 0FH
BL = drive code (0 = default, 1=A, 2=B, etc.)
Returns: If function successful
Carry flag = clear
AL = mapping code
00H, if only one logical drive code
assigned to the block device
01H-1AH, logical drive code (1=A,
2=B, etc.) mapped to the
block device
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione secondaria imposta il successivo codice dell'unità logica che verrà utilizzato per fare riferimento a un dispositivo a blocchi.
INT 21H (0x21)
Funzione 45H (0x45 o 69) --> Maniglia duplicata
Call with: AH = 45H
BX = handle to be duplicated
Returns: If function successful
Carry flag = clear
AX = new handle
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione restituisce un nuovo handle che fa riferimento allo stesso dispositivo o file nella stessa posizione per un determinato handle per un dispositivo o file attualmente aperto.
INT 21H (0x21)
Funzione 46H (0x46 o 70) --> Maniglia di reindirizzamento
Call with: AH = 46H
BX = handle for file or device
CX = handle to be redirected
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Se sono presenti due handle specificati, questa funzione fa in modo 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.
INT 21H (0x21)
Funzione 47H (0x47 o 71) --> Prendi corrente
directory
Call with: AH = 47H
DL = drive code (0 =default, 1=A,
2=B, etc.)
DS: SI = segment: offset of 64-byte buffer
Returns: If function is successful
Carry flag = clear
And buffer is filled in with full pathname from root of current directory.
If function is unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione ottiene una stringa ASCIIZ che descrive il percorso dalla radice alla directory corrente e il nome di quella directory.
INT 21H (0x21)
Funzione 48H (0x48 o 72) --> Allocare memoria
bloccare
Call with: AH = 48H
BX = number of paragraphs of memory
needed
Returns: If function successful
Carry flag = clear
Ax = base segment address of allocated
block
If function unsuccessful
Carry flag = set
AX = error code
BX = size of largest available block
(paragraphs)
Commenti:
Alloca un blocco di memoria e restituisce un puntatore all'inizio dell'area allocata.
INT 21H (0x21)
Funzione 49H (0x49 o 73) --> Rilascia la memoria
bloccare
Call with: AH = 49H
ES = segment of block to be released
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione viene utilizzata per rilasciare un blocco di memoria e lo rende 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 se l'indirizzo del segmento passato nel registro ES non è un indirizzo di base valido per un blocco di memoria esistente.
INT 21H (0x21)
Funzione 4AH (0x4A o 74) --> Ridimensiona la memoria
bloccare
Call with: AH = 4AH
BX = desired new block size in paragraphs
ES = segment of block to be modified
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
BX = maximum block size available
(paragraphs)
Commenti:
Questa funzione riduce o estende dinamicamente un blocco di memoria, in base alle esigenze di un programma applicativo.
INT 21H (0x21)
Funzione 4BH (0x4B o 75) --> Esegui il programma (EXEC)
Call with: AH = 4BH
AL = sub function
00H = Load and Execute Program
03H = Load Overlay
ES: BX = segment: offset of parameter block
DS: DX = segment: offset of ASCIIZ program
pathname
Returns: If function successful
Carry flag = clear
Registers are preserved in the usual fashion.
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione consente a un programma applicativo di eseguire un altro programma, riprendendo il controllo al termine. Può essere utilizzato anche per caricare gli overlay, sebbene questo sia un uso raro.
INT 21H (0x21)
Funzione 4CH (0x4C o 76) --> Termina il processo
con codice di reso
Call with: AH = 4CH
AL = return code
Returns: Nothing
Commenti:
Questa funzione termina il processo corrente, passando un codice di ritorno al processo padre. Questo è uno dei numerosi metodi che un programma può utilizzare per eseguire un'uscita finale.
INT 21H (0x21)
Funzione 4DH (0x4D o 77) --> Ottieni il codice di reso
Chiama con: AH = 4DH
Restituisce: AH = tipo di uscita
00H, if normal termination by INT 20H, INT 21H
Function 00H, or INT 21H Functions 4CH
01H if termination by user’s entry of Ctrl-C
02H if termination by critical-error handler
03H if termination by INT21H Function 31H or
INT 27H |
AL = return code passed by child process
(0 if child terminated by INT 20H,
INT 21H Function 00H, or INT 27H)
Commenti:
Questa funzione viene utilizzata da un processo padre, dopo l'esecuzione riuscita di una chiamata EXEC (INT 21H Function 4BH), per ottenere il codice di ritorno e il tipo di terminazione di un processo figlio.
INT 21H (0x21)
Funzione 4EH (0x4E o 78) --> Trova il primo file
Call with: AH = 4EH
CX = search attribute (bits may be combined)
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function successful and matching file found
Carry flag = clear
E i risultati della ricerca restituiti nell'area di trasferimento del disco corrente come segue:
Byte(s) |
Description |
00H-14H |
Reserved (0) |
15H |
Attribute of matched file or directory |
16H-17H |
File time
bits 00H-04H = 2-second increments (0-29)
bits 05H-0AH = minutes (0-59)
bits 0BH-0FH = hours (0-23) |
18H-19H
|
File date
bits 00H-04H = day (1-31)
bits 05H-08H = month (1-12)
bits 09H-0FH = year (relative to 1980) |
1AH-1DH |
File size |
1EH-2AH |
ASCIIZ filename and extension |
Se la funzione non riesce
Carry flag = set
AX = error code
Commenti:
Questa funzione ricerca nella directory predefinita o specificata sull'unità predefinita o specificata il primo file corrispondente per una specifica specifica di file sotto forma di stringa ASCIIZ. Per la significatività dei bit degli attributi, fare riferimento alla tabella della significatività dei bit fornita prima.
INT 21H (0x21)
Funzione 4FH (0x4F o 79) --> Trova il file successivo
Call with: AH = 4FH
Returns: If function is successful and matching file found
Carry flag = clear
If function is unsuccessful
Carry flag = set
AX = error code
Commenti:
Se è presente una precedente chiamata riuscita a INT 21H Function 4EH, questa funzione trova il file successivo nella directory predefinita o specificata sull'unità predefinita o specificata che corrisponde alla specifica del file originale.
INT 21H (0x21)
Funzione 50H (0x50 o 80) --> Riservato
INT 21H (0x21)
Funzione 51H (0x51 o 81) --> Riservato
INT 21H (0x21)
Funzione 52H (0x52 o 82) --> Riservato
INT 21H (0x21)
Funzione 53H (0x53 o 83) --> Riservato
INT 21H (0x21)
Funzione 54H (0x54 o 84) --> Ottieni flag di verifica
Call with: AH = 54H
Returns: AL = current verify flag value
00H if verify off
01H if verify on
Commenti:
Questa funzione ottiene il valore corrente del flag di verifica del sistema (lettura dopo scrittura).
INT 21H (0x21)
Funzione 55H (0x55 o 85) --> Riservato
INT 21H (0x21)
Funzione 56H (0x56 o 86) --> Rinomina file
Call with: AH = 56H
DS: DX = segment: offset of current ASCIIZ
pathname
ES: DI = segment: offset of new ASCIIZ
pathname
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione Rinomina un file e/o sposta la sua voce di directory in un'altra sullo stesso disco. In MS-DOS versioni 3.0 e successive, questa funzione può essere utilizzata anche per rinominare le directory
Se un qualsiasi elemento del nome del percorso non esiste o esiste già un file con il nuovo nome del percorso o se la specifica del percorso corrente contiene un'unità disco diversa da quella del nuovo nome del percorso o se il file viene spostato nella directory principale e la radice la directory è piena o l'utente non ha diritti sufficienti, la funzione per rinominare i file non riesce.
INT 21H (0x21)
Funzione 57H (0x57 o 87) --> Ottieni o imposta la data e l'ora del file
Call with: If getting date and time
AH = 57H
AL = 00H
BX = handle
If setting date and time
AH = 57H
AL = 01H
BX = handle
CX = time
bits 00H-04H = 2-second increments (0-29)
bits 05H-0AH = minutes (0-59)
bits 0BH-0FH = hours (0-23)
DX = date
bits 00H-04H = day (1-31)
bits 05H-08H = month (1-12)
bits 09H-0FH = year (relative to 1980)
Returns: If function successful
Carry flag = clear
and, if called with AL = 00H
CX = time
DX = date
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione ottiene o modifica la data e l'ora nella voce della directory principale del file.
INT 21H (0x21)
Funzione 58H (0x58 o 88) --> Ottieni o imposta una strategia di allocazione
Call with: If getting strategy code
AH = 58H
AL = 00H
If setting strategy code
AH = 58H
AL = 01H
BX = desired strategy code
00H = first fit
01H = best fit
02H = last fit
Returns: If function successful
Carry flag = clear
and, if called with AL = 00H
AX = current strategy code
If function unsuccessful
Carry flag = set
AX = error code
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 adatta, MS-DOS ricerca i blocchi di memoria disponibili dall'indirizzo basso all'indirizzo alto, assegnando il primo abbastanza grande da soddisfare la richiesta di allocazione del blocco.
In caso di strategia di allocazione Best fit, MS-DOS ricerca 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 da indirizzi alti a indirizzi bassi, assegnando quello più alto abbastanza grande da soddisfare la richiesta di allocazione dei blocchi.
INT 21H (0x21)
Funzione 59H (0x59 o 89) --> Ottieni errore esteso
Informazioni
Call with: AH = 59H
BX = 00H
Returns: AX = extended error code
Di seguito è stata fornita la tabella dei codici di errore:
Error Code |
Error |
01H |
function number invalid |
02H |
file not found |
03H |
path not found |
04H |
too many open files |
05H |
access denied |
06H |
handle invalid |
07H |
memory control blocks destroyed |
08H |
insufficient memory |
09H |
memory block address invalid |
0AH (10) |
environment Invalid |
0BH (11) |
format invalid |
0CH (12) |
access code invalid |
0DH (13) |
data invalid |
0EH (14) |
unknown unit |
0FH (15) |
disk drive invalid |
10H (16) |
attempted to remove current directory |
11H (17) |
not same device |
12H (18) |
no more files |
13H (19) |
disk write-protected |
14H (20) |
unknown unit |
15H (21) |
drive not ready |
16H (22) |
unknown command |
17H (23) |
data error (CRC) |
18H (24) |
bad request structure length |
19H (25) |
seek error |
1AH (26) |
unknown media type |
1BH (27) |
sector not found |
1CH (28) |
printer out of paper |
1DH (29) |
write fault |
1EH (30) |
read fault |
1FH (31) |
general failure |
20H (32) |
sharing violation |
21H (33) |
lock violation |
22H (34) |
disk change invalid |
23H (35) |
FCB unavailable |
24H (36) |
sharing buffer exceeded |
25H-31H |
reserved |
32H (50) |
unsupported network request |
33H (51) |
remote machine not listening |
34H (52) |
duplicate name on network |
35H (53) |
network name not found |
36H (54) |
network busy |
37H (55) |
device no longer exists on network |
38H (56) |
net BIOS command limit exceeded |
39H (57) |
error in network adapter hardware |
3AH (58) |
incorrect response from network |
3BH (59) |
unexpected network error |
3CH (60) |
remote adapter incompatible |
3DH (61) |
print queue full |
3EH (62) |
not enough space for print file |
3FH (63) |
print file canceled |
40H (64) |
network name deleted |
41H (65) |
network access denied |
42H (66) |
incorrect network device type |
43H (67) |
network name not found |
44H (68) |
network name limit exceeded |
45H (69) |
net BIOS session limit exceeded |
46H (70) |
file sharing temporarily paused |
47H (71) |
network request not accepted |
48H (72) |
print or disk redirection paused |
49H-4FH |
reserved |
50H (80) |
file already exists |
51H (81) |
reserved |
52H (82) |
cannot make directory |
53H (83) |
fail on INT 24H (critical error) |
54H (84) |
too many redirections |
55H (85) |
duplicate redirection |
56H (86) |
invalid password |
57H (87) |
invalid parameter |
58H (88) |
network device fault |
59H (89) |
function not supported by network |
5AH (90) |
required system component not installed |
BH = classe di errore
01H |
if out of resource (such as storage or handles) |
02H |
if not error, but temporary situation (such as locked region in file) that can be expected to end |
03H |
if authorization problem |
04H |
if internal error in system software |
05H |
if hardware failure |
06H |
if system software failure not the fault of the active process (such as missing configuration files) |
07H |
if application program error |
08H |
if file or item not found |
09H |
if file or item of invalid type or format |
0AH (10) |
if file or item locked |
0BH (11) |
if wrong disk in drive, bad spot on disk, or storage medium problem |
0CH (12) |
if item already exists |
0DH (13) |
unknown error |
BL = azione consigliata
01H |
Retry reasonable number of times, then prompt user to select abort or ignore |
02H |
retry reasonable number of times with delay between retries, then prompt user to select abort or ignore |
03H |
get correct information from user (typically caused by incorrect file name or device specification) |
04H |
abort application with cleanup (i.e., terminate the program in as orderly a manner as possible: releasing locks, closing files, etc.) |
05H |
perform immediate exit without cleanup |
06H |
ignore error |
07H |
retry after user intervention to remove cause of error |
CH = error locus
01H unknown
02H block device (disk or disk emulator)
03H network
04H serial device
05H memory
ES: DI = ASCIIZ volume label of disk to
insert, if AX = 0022H (invalid disk change)
Commenti:
Questa funzione ottiene informazioni dettagliate sull'errore dopo una precedente chiamata di funzione INT 21H non riuscita, inclusa l'azione correttiva consigliata.
INT 21H (0x21)
Funzione 5AH (0x5A o 90) --> Crea temporaneo
file
Call with: AH = 5AH
CX = attribute (bits may be combined)
DS: DX = segment: offset of ASCIIZ path
Returns: If function is successful
Carry flag = clear
AX = handle
DS: DX = segment: offset of complete ASCIIZ
pathname
If function is unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione crea un file con un nome univoco, nella directory corrente o specificata sull'unità disco predefinita o specificata, e restituisce un handle che può essere utilizzato dal programma dal programma per il successivo accesso al file. Il nome generato per il file viene restituito anche in un buffer specificato dal programma.
Se un qualsiasi elemento del percorso non esiste o il file viene creato nella directory principale e la directory principale è piena, la funzione non riesce.
INT 21H (0x21)
Funzione 5BH (0x5B o 91) --> Crea un nuovo file
Call with: AH = 5BH
CX = attribute (bits may be combined)
DS: DX = segment: offset of ASCIIZ pathname
Returns: If function is successful
Carry flag = clear
AX = handle
If function is unsuccessful
Carry flag = set
AX = error code
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 determinato percorso ASCIIZ.
Se esiste già un file con lo stesso nome e percorso o qualsiasi elemento del percorso specificato non esiste o il file viene creato nella directory principale e la directory principale è piena o l'utente non dispone di diritti di accesso insufficienti, il funzione fallisce.
INT 21H (0x21)
Funzione 5CH (0x5C o 92) --> Blocca o sblocca la regione del file
Call with: AH = 5CH
AL = 00H if locking region
01H if unlocking region
BX = handle
CX = high part of region offset
DX = low part of region offset
SI = high part of region length
DI = low part of region length
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione blocca o sblocca l'area specificata di un file. Questa funzione non è disponibile a meno che non venga caricato il modulo di condivisione file (come SHARE.EXE).
INT 21H (0x21)
Funzione 5DH (0x5D o 93) --> Riservato
INT 21H (0x21)
Funzione 5EH (0x5E o 94), sottofunzione 00H (0x00)
--> Ottieni il nome della macchina
Call with: AH = 5EH
AL = 00H
DS: DX = segment: offset of buffer to receive
string
Returns: If function is successful
Carry flag = clear
CH = 00H if name not defined
<> 00H if name defined
CL = netBIOS name number (if CH <> 0)
DX: DX = segment: offset of identifier (if CH <> 0)
If function is unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione secondaria restituisce l'indirizzo di una stringa ASCIIZ che identifica il computer locale. Questa chiamata di funzione è disponibile solo quando la rete Microsoft è in esecuzione.
INT 21H (0x21)
Funzione 5EH (0x5E o 94), sottofunzione 02H (0x02)
--> Imposta la stringa di configurazione della stampante
Call with: AH = 5EH
AL = 02H
BX = redirection list index
CX = length of setup string
DS: SI = segment: offset of setup string
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione secondaria specifica una stringa da inviare davanti a tutti i file diretti a una particolare stampante di rete, consentendo agli utenti di nodi di rete diversi di specificare modalità operative personalizzate sulla stessa stampante.
INT 21H (0x21)
Funzione 5EH (0x5E o 94), sottofunzione 03H (0x03)
--> Ottieni la stringa di configurazione della stampante
Call with: AH = 5EH
AL = 03H
BX = redirection list index
ES: DI = segment: offset of buffer to receive
setup string
Returns: If function successful
Carry flag = clear
CX = length of printer setup string
ES: DI = segment: offset of buffer to receive
setup string
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione viene utilizzata per ottenere la stringa di configurazione della stampante per una particolare stampante di rete.
INT 21H (0x21)
Funzione 5FH (0x5F o 95), sottofunzione 02H (0x02)
--> Ottieni la voce dell'elenco di reindirizzamento
Call with: AH = 5FH
AL = 02H
BX = redirection list index
DS: SI = segment: offset of 16-byte buffer to
receive local device name
ES: DI = segment: offset of 128-byte buffer to
receive network name
Returns: If function successful
Carry flag = clear
BH = device status flag
Bit 0 = 0 if device valid
= 1 if not valid
BL = device type
03H, if printer
04H, if drive
CX = stored parameter value
DX = destroyed
BP = destroyed
DS: SI = segment: offset of ASCIIZ local
device name
ES: DI = segment: offset of ASCIIZ network
name
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione secondaria consente l'ispezione dell'elenco di reindirizzamento del sistema, che associa nomi logici locali a file, directory o stampanti di rete. Questa chiamata di funzione è disponibile solo quando Microsoft Networks è in esecuzione ed è stato caricato il modulo di condivisione file.
INT 21H (0x21)
Funzione 5FH (0x5F o 95), sottofunzione 03H (0x03) --> Reindirizza il dispositivo
Call with: AH = 5FH
AL = 03H
BL = device type
03H, if printer
04H, if drive
DS: SI = segment: offset of ASCIIZ local
device name
ES: DI = segment: offset of ASCIIZ network
name, followed by ASCIIZ password
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
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 ed è stato caricato il modulo di condivisione file (SHARE.EXE).
INT 21H (0x21)
Funzione 5FH (0x5F o 95), sottofunzione 04H (0x04)
--> Annulla il reindirizzamento del dispositivo
Call with: AH = 5FH
AL = 04H
DS: SI = segment: offset of ASCIIZ local
device name
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione secondaria 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 ed è stato caricato il modulo di condivisione file come SHARE.EXE.
INT 21H (0x21)
Funzione 60H (0x60 o 96) --> Riservato
INT 21H (0x21)
Funzione 61H (0x61 o 97) --> Riservato
INT 21H (0x21)
Funzione 62H (0x62 o 98) --> Ottieni il segmento del programma
Indirizzo prefisso (PSP)
Call with: AH = 62H
Returns: BX = segment address of program segment
prefix
Commenti:
Questa funzione ottiene l'indirizzo del segmento (paragrafo) del Program Segment Prefix (PSP) per il programma attualmente in esecuzione.
INT 21H (0x21)
Funzione 64H (0x64 o 100) --> Riservato
INT 21H
Funzione 65H (0x65 o 101) --> Ottieni esteso
informazioni sul paese
Call with: AH = 65H
AL = sub function
00H = Get General
Internationalization Information
02H = Get Pointer to Uppercase
Table
04H = Get Pointer to Filename
Uppercase Table
06H = Get Pointer to Collating Table
07H = Get Pointer to Double-Byte
Character Set (DBCS) Vector
BX = code page of interest (-1 = active
CON device)
CX = length of buffer to receive
information (must be >=5)
DX = country ID (-1 = default)
ES: DI = address of buffer to receive
information
Returns: If function successful
Carry flag = clear
And requested data placed in calling program’s buffer
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
In questo modo vengono ottenute informazioni sul paese e/o sulla codepage specificati. Fare riferimento alla tabella di internazionalizzazione fornita prima per conoscere i byte di informazioni.
INT 21H (0x21)
Funzione 66H (0x66 o 102) --> Ottieni o imposta il codice
pagina
Call with: AH = 66H
AL = sub function
01H = Get Code Page
02H = Select Code Page
BX = code page to select, if AL = 02H
Returns: If function is successful
Carry flag = clear
And, if called with AL = 01H
BX = active code page
DX = default code page
If function is unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione ottiene o seleziona la codepage corrente.
INT 21H (0x21)
Funzione 67H (0x67 o 103) --> Imposta il numero di maniglie
Call with: AH = 67H
BX = number of desired handles
Returns: If function is successful
Carry flag = clear
If function is unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione imposta il numero massimo di file e dispositivi che possono essere aperti contemporaneamente utilizzando gli handle dal processo corrente.
INT 21H (0x21)
Funzione 68H (0x68 o 104) --> File di commit
Call with: AH = 68H
BX = handle
Returns: If function successful
Carry flag = clear
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione forza la scrittura fisica nel dispositivo di tutti i dati nei buffer interni di MS DOS associati a un handle specificato. Se l'handle fa riferimento a un file e il file è stato modificato, l'indicatore di data e ora e la dimensione del file nella voce della directory principale del file vengono aggiornati.
INT 21H (0x21)
Funzione 69H (0x69 o 105) --> Riservato
INT 21H (0x21)
Funzione 6AH (0x6A o 106) --> Riservato
INT 21H (0x21)
Funzione 6BH (0x6B o 107) --> Riservato
INT 21H (0x21)
Funzione 6CH (0x6C o 108) --> File aperto esteso
Call with: AH = 6CH
AL = 00H
BX = open mode
Bit(s) |
Significance |
0-2 |
Access type
000 = read-only
001 = write-only
010 = read/write |
3 |
Reserved (0) |
4-6 |
Sharing mode
000 = compatibility
001 = deny read/write (deny all)
010 = deny write
011 = deny read
100 = deny none |
7 |
Inheritance
0 = child process inherits handle
1 = child does not inherit handle |
8-12 |
Reserved (0) |
13 |
Critical error handling
0 = execute INT 24H
1 = return error to process |
14 |
Write-through
0 = writes may be buffered and deferred
1 = physical write at request time |
15 |
Reserved (0) |
CX = attributo del file (i bit possono essere combinati;
se ignorato se apertofare riferimento a bit Tabella di significato.
DX = bandiera aperta
Bit(s) |
Significance |
0-3 |
Action if file exists
0000 = fail
0001 = open file
0010 = replace file |
4-7 |
Action if file does not exists
0000 = fail
0001 = create file |
8-15 |
Reserved (0) |
DS: SI = segment: offset of ASCIIZ pathname
Returns:mIf function successful
Carry flag = clear
AX = handle
CX = action taken
1 = file existed and was
opened
2 = file did not exists and
was created
3 = file existed and was
replaced
If function unsuccessful
Carry flag = set
AX = error code
Commenti:
Questa funzione apre, crea o sostituisce un file nella directory designata o predefinita sull'unità disco designata o predefinita per un determinato percorso ASCIIZ e restituisce un handle che può essere utilizzato dal programma per il successivo accesso al file.
Se un qualsiasi elemento del percorso non esiste o il file viene creato nella directory principale e la directory principale è piena o il file viene creato ed esiste già un file con lo stesso nome e l'attributo di sola lettura in la directory specificata o l'utente ha diritti di accesso insufficienti, la funzione non riesce.
Pagina modificata il: 10/03/2022