Bonjour,
Voilà je me pose quelques questions au sujet de div et idiv.
Les instruction de division en x86, comme vous le savez, partent avec un dividende d'une taille x, un diviseur d'une taille x/2, et donnent un quotient de taille x/2.
Supposons que EDX:EAX contienne le plus gros nombre possible qu'ils peuvent contenir, soit ffffffffffffffff (soit 64 bits mis à 1), et que ECX contienne 2.
Si je fais
Le résultat auquel on s'attend serait 7fffffffffffffff. Or, on sait très bien que la division échouera, puisque EAX ne peut contenir qu'un nombre de 32 bits maximum, et que c'est justement à 32bits qu'est consigné le quotient.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 mov eax, ffffffffffh; mov edx, ffffffffffh; mov ecx, 2; div ecx;
Ma question est: Y a-t-il un moyen de circonvenir le problème?
Dans le cas d'une opérande 32 bits divisé par une opérande 16 bits, par example ffffffff divisé par 2, c'est facile: On a qu'à étendre ffffffff à EAX:EDX, et d'étendre le diviseur dans une opérande 32 bits, puis on fait la division et on obtient le bon quotient, puisque ce dernier se trouve consigné dans une opérande 32 bits.
Par contre, je ne vois pas de solution pour diviser un 64 bits par un 2 étendu dans une opérande 32 bits.
Or, en C, c'est parfaitement possible.
Prenons le code:
Le résultat affiché par printf() sera celui attendu, soit 7fffffffffffffff:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #include <stdio.h> int main(void) { unsigned long long int a = 0xffffffffffffffff, b; b = a/2; printf ("%ullx\n", b); // %I64x sur Windows return 0; }
Bref, comment est-ce que le compilateur en C fait pour que le bon résultat puisse être obtenu?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 I:\>a.exe 7fffffffffffffff
Merci bien,
Cordialement,
Array
Partager