Tutorial Sezione Assembler

Dettaglio Istruzioni 

Le Schede del Tutorial

  Istruzioni della Cpu 80x86

SCHEDA n° 07 [I/ 040 di 198] 

    

    IDIV - Divisione tra numeri Interi con segno
     
bulletQuesta istruzione esegue la divisione tra operandi ritenuti interi con segno; il dividendo (destinazione) è assunto per default:
bulletda AX (numero a 16 bit), se il divisore (sorgente) ha la dimensione di un byte; il risultato (quoziente) è lasciato in AL e il resto in AH.
bulletda DX:AX (numero a 32 bit), se il divisore (sorgente) ha la dimensione di una word; il risultato (quoziente) è lasciato in AX e il resto in DX.
bulletda EDX:EAX (con 80386/486, numero a 64 bit), se il divisore (sorgente) ha la dimensione di una doubleword; il risultato (quoziente) è lasciato in EAX e il resto in EDX.
bulletIl divisore (sorgente) non può comunque essere una costante, cioè un dato immediato come, per esempio, in IDIV 05H.
bulletDa notare che resto ha lo stesso segno del quoziente.
bulletLe sue caratteristiche sono riassunte nella seguente tabella (leggi le istruzioni Legenda della Tabella):
         
        IDIV   Sorgente
 AL   <<   AX / sorgente    e     AH << resto
 AX   <<   DX:AX / sorgente    e     DX << resto

Esempio di Applicazione

Cicli di Clock Mem
Acces

Bytes
Flag   influenzate
Mnemonico Operandi 86 268 386 486 O D I T S Z A P C

IDIV

DL

101,112 17 19 19 no 2 ?  

 

   

 

? ? ? ? ?

IDIV

[Depo01]

(107,118)+EA 20 22 20 1 2,4

IDIV

[Depo02]

(171,190)+EA 38 30 28 1 2,4
IDIV

[Depo04]

no no 46 44 1 2,4

IDIV

SI

165,184 25 27 27 no 2
IDIV

EDX

no no 43 43 no 2
         
bulletLa tabella evidenzia le possibili tipologie dell'unico operando passato (quello implicito è l'accumulatore): con registro o con memoria
          
bulletSe gli operandi sono coerenti con l'operazione aritmetica richiesta il funzionamento di questa istruzione è piuttosto scontato; vediamo 2 casi possibili:
bulletla divisione coinvolge un dividendo a 16 bit (predisposto in AX=0100H=+256) e un divisore a 8 bit (passato in DL=10H=+16); il risultato (quoziente) è previsto in AL (256/16=+16=10H) e il resto è previsto in AH (=0=00H):
     

-R
AX=0100 BX=0000 CX=0000 DX=0010 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 F6FA      IDIV DL
-T
AX=0010 BX=0000 CX=0000 DX=0010 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0102 NV UP EI PL NZ AC PO NC
118C:0102

     
bulletla divisione coinvolge un dividendo a 32 bit (predisposto in DX,AX=01000000H=+16777216) e un divisore a 16 bit (passato in CX=1000H=+4096); il risultato (quoziente) è previsto in AX (16777216/4096=+4096=1000H) e il resto è previsto in DX (=0=0000H):
     

-R
AX=0000 BX=0000 CX=1000 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 F7F9      IDIV CX
-T
AX=1000 BX=0000 CX=1000 DX=0000 SP=ED63 BP=0000 SI=0000 DI=0000
DS=118C ES=118C SS=118C CS=118C IP=0102 NV UP EI PL NZ AC PO NC
118C:0102

     
bulletSe 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:
bulletil 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 IDIVisore, 0) prima di eseguire ogni divisore; 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 F6FA      IDIV DL
-T
Overflow di divisione

     
bulletil 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 F7F9      IDIV CX
-T
Overflow di divisione

     
bulletLa figura seguente mostra le risorse richieste da questa istruzione in funzione dell'operando coinvolto (leggi le istruzioni):
          

Addr

Codifica Masm

Sequenza Bytes

Istruzione

0100
0101
55
55AA
55
AA 55
Depo01 
Depo02
DB 55H
DW 55AAH
---- ---------------- ----------------- ------- ----------------------
0103
0105
010A
010E
0110
0112
F6 FA
2E F7 3E 0101
F6 3E 0100
F7 FE
F6 F8
F7 F8
F6 FA
2E F7 3E 01 01
F6 3E 00 01
F7 FE
F6 F8
F7 F8
IDIV DL
IDIV CS:[Depo02]
IDIV [Depo01]
IDIV SI
IDIV AL
IDIV AX

    

Pagina Precedente Scheda n° 07 Pagina Successiva Istruzioni Cpu 80x86 Torna al Menu delle Schede del "Tutorial" Lezioni - Vai al DownLoad dei files DOC Torna al Menu del "Tutorial"
Istruzione 040 - IDIV

    

SCHEDE » 1.Header EXE 2.PseudoOp MASM 3.Differenza tra Macro e Procedure
4.
Tabella Vettori 5.PSP 6.Stack 7.Istruzioni 80x86
8.La misura dell'Informazione 9.Numeri e Logica Binaria
TUTORIAL » Indirizzi Base | Registri Interni | Area Comunicaz. BIOS | Funzioni BIOS | Funzioni DOS
Prefazione | CAP 1 | CAP 2 | Schede | Palestra
Libreria ASM | Libreria MAC | Progetti ASM | Download | Info | Indice
Home 
Pascal|Manuali|Tabelle|Schede
Tutorial Assembly|Palestra Assembler
Aggiungi Giobe®2000 ai preferiti  
Motore
Ricerca
  Rendi Giobe®2000 pagina di Default
© 2001-2010  -  Studio Tecnico ing. Giorgio OBER
Tutti i diritti sono riservati