Interruzioni software

Il servizio 0Ah dell'interrupt 21h:

Parametro ricevuto: nei registri DS:DX ci deve essere il puntatore all'area di memoria in cui scrivere la stringa acquisita da tastiera

Formato dell'area di memoria usata dal servizio 0Ah:

OffsetNr byteDescrizione
01massimo numero di caratteri
11numero di caratteri inseriti da tastiera, escluso CR
2ncaratteri che compongono la stringa immessa, compreso carriage return

Il programma che si propone acquisisce una stringa immessa da tastiera e la stampa sullo schermo. In questo esempio si illustra il procedimento per generare un file COM, un file eseguibile che ha tutti i segmenti sovrapposti (nello spazio di 64K).

.model TINY

.code

ORG 100H ; un file COM viene caricato all'offset 100h

In un programma con estensione .com i segmenti dati (DS ed ES) coincidono con il segmento CS:

inizio:

  MOV AX, CS

  MOV DS, AX

  MOV ES, AX

L'immissione di una stringa da tastiera avviene richiamando la funzione 0AH dell'int 21h. Questa legge una stringa da tastiera e, quando si preme invio, la memorizza all'indirizzo DS:DX

  MOV DX, OFFSET s1

  MOV AH, 0AH

  INT 21h

La variabile nl (Nuova Linea) contiene i codici per andare a capo: 13 (Carriage Return) e 10 (Line Feed). Il suo indirizzo viene copiato in DX perchè la funzione 9 dell'int 21h stampa la stringa puntata da DS:DX.

  MOV DX, offset nl

  MOV AH, 9

  INT 21h

Nel registro DI si porta l'indirizzo della stringa introdotta. Il registro BX viene azzerato:

  MOV DI, offset s1

  XOR BX, BX

Si legge in BL il secondo byte della variabile contenente la stringa introdotta. Il secondo byte rappresenta il numero di caratteri della stringa.

  MOV BL, [DI+1]

Aggiungendo a DI questo valore e sommando anche i 2 byte iniziali si trova la fine della stringa, dove si inserisce il carattere di fine stringa

  MOV BYTE PTR [DI+BX+2], '$'

Per stampare la stringa si porta in DX il puntatore alla stringa:

  MOV DX, offset s1

Il primo byte contiene la dimensione del buffer, il secondo contiene il numero effettivo di caratteri. Quindi si devono saltare questi 2 byte, prima di richiamare la funzione 9 dell'int 21:

  ADD DX, 2

  MOV AH, 9

  INT 21h

A questo punto il semplice programma dimostrativo dei servizi 9 e 10 dell'int 21h è terminato e si restituisce il controllo al sistema operativo:

  MOV AH, 4Ch

  INT 21h

Le variabili usate dal programma sono state dichiarate al termine del codice:

s1 DB 30, 30 dup(' ')

nl DB 13, 10, '$'

END inizio