| Se invece gli operandi sono incoerenti il processore si
ribella ed esegue un INT 00, una speciale
procedura di sistema messa in esecuzione
quando viene tentata una divisione per 0;
: il programma in esecuzione viene terminato
e sul monitor appare la segnalazione d'errore "overflow
di divisione".
Prima di entrare nel dettaglio è
interessante osservare cosa risponde l'ambiente Debug dopo l'esecuzione di
tale procedura:
-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0100 NV UP EI PL NZ NA PO NC
118C:0100 CD00
INT 00
-P
Overflow di divisione
|
Questa situazione si può verificare in 2 occasioni:
| il divisore è effettivamente nullo (per esempio DL=00H=0);
si tratta di un errore piuttosto facile da commettere, la maggior parte
delle volte per non aver pensato che un divisore soggetto a decremento
(per esempio all'interno di un loop) può raggiungere anche il valore 0.
Per ovviare a questo rischio è sempre utile confrontare il divisore con
0 (con CMP divisore, 0) prima di
eseguire ogni divisone; nell'esempio seguente il a
16 bit (predisposto in AX=0100H=256)
viene diviso per zero |
-R
AX=0100
BX=0000 CX=0000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0100 NV UP EI PL NZ NA PO NC
118C:0100 F6F2
DIV DL
-T
Overflow di divisione
|
| il divisore è troppo piccolo, o meglio il quoziente
ottenuto è troppo grande per essere contenuto nel registro destinazione;
nell'esempio seguente il a
32 bit (predisposto in DX,AX=01000000H=16777216)
viene diviso per un operando troppo piccolo (passato in CX=0010H=16);
l'operazione non produce risultato e il processore segnala errore: |
-R
AX=0000
BX=0000 CX=0010
DX=0100
SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0100 NV UP EI PL NZ NA PO NC
118C:0100 F7F1
DIV CX
-T
Overflow di divisione
|
|