|
 |
PSP - Prefisso del
Segmento di Programma |
SCHEDA n° 05 [
5
di 5] |
 |
|
PSP - Il passaggio dei Parametri a livello DOS |
|
 | Una delle cose più utili della programmazione
in assembly è la possibilità di passare
parametri al nostro programma prima che esso venga eseguito,
cioè nel momento del suo lancio, al prompt del Dos. |
 | La tecnica è estremamente banale ed efficace:
basta elencarli, uno dopo l'altro, dopo il nome del programma e separati (di
solito, ma non necessariamente) da spazi. L'esempio seguente passa al
programma Ora.com il valore di
partenza (il solo parametro 12:20:00):
| C:\ARCH-LAB\LAVORO>ora
12:20:00 |
|
 | La forza di questa opportunità è maggiore
della tua attuale potenziale fantasia; con essa si può:
 | passare valori
iniziali a processi di controllo hardware o software. |
 | passare i cosiddetti switch,
che trasformano in professionale
ogni nostro programma; gli switch sono comandi
secchi, di solito
costituiti da una sola lettera con davanti una barra
o il segno meno, come in /H
o -H. L'esempio proposto non è
casuale: si tratta del modo più consueto per consentire ad un programma
di spiegare il suo funzionamento (Help). |
 | creare un eseguibile multifunzionale, in
grado cioè di funzionare in modi diversi, in base alla situazione
contingente del momento del lancio. |
|
 | Vediamo la situazione in memoria, dentro il
PSP, dopo il comando suggerito precedentemente: |
C:\ARCH-LAB\LAVORO>debug ora.com 12:20:00
-d 0080
0CB8:0080 09 20 31 32 3A 32 30 3A-30 30 0D
00 00 00 00 00 .
12:20:00....
0CB8:0090 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
..............
0CB8:00A0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
..............
0CB8:00B0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
..............
0CB8:00C0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
..............
0CB8:00D0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
..............
0CB8:00E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
..............
0CB8:00F0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
.............. |
 | Osserviamo che solo 11 bytes sono stati
coinvolti, esattamente 2 in più rispetto il numero dei caratteri digitati
dopo il nome del programma eseguibile al prompt del Dos (che, compreso lo
spazio iniziale, sono 9, cioè: " 12:20:00"). |
 | In pratica quella dei parametri
è una struttura ben precisa:
 | il primo byte
(all'indirizzo 0080H) esprime la
lunghezza della coda del comando
(cioè della sequenza di parametri).
In altre parole è il numero esadecimale dei caratteri digitati dopo il
nome dell'eseguibile |
 | l'ultimo byte (dopo l'ultimo carattere
della stringa) è sempre 0DH, il valore Ascii che rappresenta la
pressione del tasto Invio. |
|
 | In pratica il testo del parametro inizia
sempre alla locazione 0082H e non può
essere più lungo di 126 caratteri; in caso contrario andrebbe a
sovrascrivere il codice macchina del
nostro eseguibile, senza dubbio presente a partire da
0100H.
In ogni caso il Dos previene (ed evita) questa eventualità limitando
d'ufficio il numero di caratteri digitabili in una riga di comando, e
segnalando acusticamente con lo speaker di sistema ogni eventuale abuso. |
 | Data l'importanza di questa opportunità
mostriamo in che modo il nostro programma può leggere i parametri passati a
livello dos (cioè digitati dopo il nome del programma). Prendiamo come
riferimento il comando dato all'inizio della pagina per inizializzare l'ora. |
 | La figura mostra l'estratto della
zona
parametri del PSP e, sotto, il codice necessario per gestirla:
0080h
DB 09H ;sono
previsti 9 caratteri effettivi
0081H DB ' 12:20:00' ;gli effettivi 9 caratteri
008AH DB
0DH ;codice
dell'Invio di conferma |
MOV AX, CS ;Prepara in ES lo stesso
valore di
MOV ES,AX
;CS (per altro già
presente)
MOV SI,0080H
;Assume in CX la dimensione del
MOV CH,00H
;parametro passato al prompt del
MOV CL,DS:[SI] ;DOS
(escluso l'<Invio> finale)
DEC CX
;Elimina dal conto lo spazio
ADD SI,0002H
;iniziale e copia il parametro
LEA DI,depPAR ;(escluso
lo spazio iniziale e
CLD
;il codice dell 'Invio finale) da
REP MOVSB
;DS:SI a ES:DI, con l'aiuto della
;potente istruzione REP MOVS |
|
 | Per funzionare
correttamente la zona dati del nostro programma deve prevedere
una adeguata quantità di bytes, identificata dall'etichetta depPAR,
in cui trasferire i caratteri del parametro. |
 | Il codice suggerito deve essere il
primo ad essere eseguito, per evitare di perdere la precaria
informazione del PSP. |
|
Scheda n° 05 |
|
|
Prefisso di Segmento di
Programma |
|
 |
 |
 |
| Scheda n° 05 -
5
|
©
2001-2010 - Studio Tecnico
ing. Giorgio OBER
Tutti i diritti sono riservati
|