Addition d'entier signé sur 64 bits sur un proc 32 bits
Bonjour.
L'environnement: P4 32 bits, Debian Squeeze, nasm, jeu d'instruction du 386.
Sûrement qqch d'idiot, mais je ne vois pas (bien sûr...) d'où vient mon erreur.
Mon exo:
Soient n_1, n_2, n_3, trois entiers signés sur 64 bits.
Mettre dans n_3 le résultat de l'opération suivante:
[ partie entière ( n_2 / 32 ) ] * 237 + n_1
Et voilà mon code:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
SECTION .data
n1 DD 0x0, 0x1
n2 DD 0xF, 0x1
n3 DD 0x0, 0x0
SECTION .text
main:
MOVZX EAX, WORD [n2+6]; mettre la partie haute du dd en n2 dans eax, avec extension du signe
IMUL EAX, 237; multiplier par 237
SHL EAX, 16; décaler de 16, puisque c la partie haute
MOV BX, WORD [n2+4]
MUL EBX, 237;
ADC EAX, EBX; add. à la partie basse
ADD EAX, [n1]; eax + partie basse de n1 (puisque j'ai divisé par 32 n2, sa partie haute est devenue la basse)
MOV [n3], EAX;
MOV EAX, [n1+4] ; partie haute de n2
ADC EAX, 0 ; eax + cf pour respecter dépassement de la dernière add
MOV [n3+4], EAX; placer la partie haute à la bonne place |
edit:
Bon je pense avoir trouvé:
Code:
1 2 3 4 5 6 7 8 9
|
main:
MOV EAX, [n2+4]; mettre la partie haute du dw en n2 dans eax, avec extension du signe
CDQ
IMUL EAX, 237; multiplier par 237
ADD EAX, [n1]; eax + partie basse de n1
MOV [n3], EAX
ADC EDX, [n1+4] ; partie haute de n2
MOV [n3+4], EDX; placer la partie haute a la bonne place |
Ça foire si le produit de la partie haute de n_2 par 237 ne tient pas sur 32 bits et/ou si la somme du produit précédent et de n_1 fait de même, mais j'imagine qu'il n'y a pas moyen d'éviter ça simplement (sans structure de contrôle)?