Assembleur 80x86 | IDIV |
---|---|
INTEL 8088+ | Division entière |
Syntaxe
IDIV Opérande |
Description
Cette instruction permet d'effectuer une division signée (nombre entier). Le dividende est implicite; il est ajuster en fonction de la taille du diviseur. Le restant est toujours plus petit que le diviseur. Le type de diviseur détermine quel registre l'instruction utilisera :
Taille | Dividende | Diviseur | Quotient | Restant |
---|---|---|---|---|
Octet | AX | Opérande | AL | AH |
Mot | DX:AX | Opérande | AX | DX |
Double mot | EDX:EAX | Opérande | EAX | EDX |
Remarques
- Optimisation : On devrait utiliser l'instruction «AND» plutôt qu'un modulo à partir d'un IDIV lorsque le nombre est une puissance 2, car il utilise beaucoup moins de cycle d'horloge qu'un IDIV; ainsi, il faudra alors appliquer AND avec une comme première opérande le numérateur et comme deuxième opérande le dénominateur - 1.
- Si vous effectuer des divisions de nombre naturel, vous devriez plutôt envisager d'utiliser les instructions «SHR» ou «DIV» car elles sont plus efficaces.
Algorithme
SI Opérande = 0 ALORS Interruption 0 SINON SI Opérande 8 bits ALORS AL ← AX ÷ Opérande AH ← AX MOD Opérande FIN SI SI Opérande 16 bits ALORS AX ← ( ( DX x 65536 ) + AX ) ÷ Opérande DX ← ( ( DX x 65536 ) + AX ) MOD Opérande FIN SI SI Opérande 32 bits ALORS EAX ← ( ( EDX x 65536 x 65536 ) + EAX ) ÷ Opérande EDX ← ( ( EDX x 65536 x 65536 ) + EAX ) MOD Opérande FIN SI FIN SI |
Mnémonique
Instruction | Opcode | Description |
---|---|---|
IDIV reg/mem8 | F6h /7 | Division entière de AX par le contenu d'un emplacement mémoire ou registre 8 bits et entrepose le quotient dans AL et restant dans AH. |
IDIV reg/mem16 | F7h /7 | Division entière de DX:AX par le contenu d'un emplacement mémoire ou registre 16 bits et entrepose le quotient dans AX et restant dans DX. |
IDIV reg/mem32 | F7h /7 | Division entière de EDX:EAX par le contenu d'un emplacement mémoire ou registre 32 bits et entrepose le quotient dans EAX et restant dans EDX. |
IDIV reg/mem64 | F7h /7 | Division entière de RDX:RAX par le contenu d'un emplacement mémoire ou registre 64 bits et entrepose le quotient dans RAX et restant dans RDX. |
Cycles d'horloge
Opérande | Cycle d'horloge | Taille en octets | |||
---|---|---|---|---|---|
8086 | 80286 | 80386 | 80486 | ||
reg8 | 101 à 112 | 17 | 19 | 19 | 2 |
reg16 | 165 à 184 | 25 | 27 | 27 | 2 |
reg32 | - | - | 43 | 43 | 2 |
mem8 | 107 à 118 (+ EA) | 20 | 22 | 20 | 2 à 4 |
mem16 | 171 à 190 (+ EA) | 38 | 30 | 28 | 2 à 4 |
mem32 | - | - | 46 | 44 | 2 à 4 |
Exceptions
Message | Mode réel | Virtuel 8086 | Mode protégé | Description |
---|---|---|---|---|
#DE(Division par zéro) | X | X | X | L'opérande de diviseur vaut 0. |
X | X | X | Le quotient est trop large pour le registre désigné. | |
#SS(Pile) | X | X | X | Une adresse mémoire dépasse la limite du segment de pile ou n'est pas canonique |
#GP(Protection général) | X | X | X | Une adresse mémoire dépasse la limite du segment de données ou n'est pas canonique |
X | Un segment de données nulle est utilisé comme référence mémoire | |||
#PF(Faute de page) | X | X | Une faute de page résultat de l'exécution de l'instruction | |
#AC(Vérifie l'alignement) | X | X | Un désalignement de la référence mémoire est effectué quand une vérification d'alignement est activé |
Exemples
L'exemple suivant contient un double mot signé dans le registre DX et AX divisé par mot signé du registre BP :
- IDIV BP
Voici quelques exemples typiques de l'utilisation de cet opérateur :
- .MODEL small
- .STACK 100h
- .DATA
- Message1 DB 'idiv(-81,9) = ','$'
- Message2 DB 'idiv(15,3) = ','$'
- Message3 DB 'idiv(16,3) = ','$'
- Message4 DB 'idiv(17,3) = ','$'
- Message5 DB 'idiv(18,3) = ','$'
- Message6 DB 'idiv(19,3) = ','$'
- Message7 DB 'idiv(0,1) = ','$'
- CRLF DB 13,10,'$'
- .CODE
- PrintDigit PROC NEAR
- OR AX,AX
- JNS Positif
- PUSH AX
- MOV AH,02h
- MOV DL,'-'
- INT 21h
- POP AX
- NEG AX
- Positif:
- MOV BX,10
- XOR CX,CX
- NextDigit:
- XOR DX,DX
- DIV BX
- PUSH DX
- INC CX
- OR AX,AX
- JNZ NextDigit
- PrintOneDigit:
- POP AX
- ADD AL,48
- MOV DL,AL
- MOV AH,02h
- INT 21h
- LOOP PrintOneDigit
- RET
- ENDP
-
- .startup
-
- ; idiv(-81,9)
- MOV AX,@data
- MOV DS,AX
- MOV AH,9
- MOV DX,OFFSET Message1
- INT 21h
- MOV AX,81
- XOR DX,DX
- MOV CX,9
- IDIV CX
- NEG AX
- CALL PrintDigit
- MOV AH,9
- MOV DX,OFFSET CRLF
- INT 21h
-
- ; idiv(15,3)
- MOV AX,@data
- MOV DS,AX
- MOV AH,9
- MOV DX,OFFSET Message2
- INT 21h
- MOV AX,15
- XOR DX,DX
- MOV CX,3
- IDIV CX
- CALL PrintDigit
- MOV AH,9
- MOV DX,OFFSET CRLF
- INT 21h
-
- ; idiv(16,3)
- MOV AX,@data
- MOV DS,AX
- MOV AH,9
- MOV DX,OFFSET Message3
- INT 21h
- MOV AX,16
- XOR DX,DX
- MOV CX,3
- iDIV CX
- CALL PrintDigit
- MOV AH,9
- MOV DX,OFFSET CRLF
- INT 21h
-
- ; idiv(17,3)
- MOV AX,@data
- MOV DS,AX
- MOV AH,9
- MOV DX,OFFSET Message4
- INT 21h
- MOV AX,17
- XOR DX,DX
- MOV CX,3
- IDIV CX
- CALL PrintDigit
- MOV AH,9
- MOV DX,OFFSET CRLF
- INT 21h
-
- ; idiv(18,3)
- MOV AX,@data
- MOV DS,AX
- MOV AH,9
- MOV DX,OFFSET Message5
- INT 21h
- MOV AX,18
- XOR DX,DX
- MOV CX,3
- IDIV CX
- CALL PrintDigit
- MOV AH,9
- MOV DX,OFFSET CRLF
- INT 21h
-
- ; idiv(19,3)
- MOV AX,@data
- MOV DS,AX
- MOV AH,9
- MOV DX,OFFSET Message6
- INT 21h
- MOV AX,19
- XOR DX,DX
- MOV CX,3
- IDIV CX
- CALL PrintDigit
- MOV AH,9
- MOV DX,OFFSET CRLF
- INT 21h
-
- ; idiv(0,1)
- MOV AX,@data
- MOV DS,AX
- MOV AH,9
- MOV DX,OFFSET Message7
- INT 21h
- MOV AX,0
- XOR DX,DX
- MOV CX,1
- IDIV CX
- CALL PrintDigit
- MOV AH,9
- MOV DX,OFFSET CRLF
- INT 21h
-
-
- MOV AX,4C00h
- INT 21h
- END
on obtiendra le résultat suivant :
div(-81,9) = -9div(15,3) = 5
div(16,3) = 5
div(17,3) = 5
div(18,3) = 6
div(19,3) = 6
div(0,1) = 0
Voir également
Instruction assembleur 80x86 - Instruction IMUL
Instruction assembleur 80x86 - Instruction DIV
Références
Le livre d'Or PC, Martin Althaus, 1992, ISBN: 2-7361-0934-1, page 811
Assembleur Facile, Philippe Mercier, 1990, ISBN: 2-501-01176-7, page 404
AMD64 Architecture Programmer's Manual Volume 3: General-Purpose and System Instructions, Edition Advanced Micro Devices, Revision 3.14, September 2007, Publication No. 24594, page 113 à 114.
Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2A: Instruction Set Reference, A-M, Edition Intel, Mars 2010, Publication No. 253666-034US, page 559 à 562.