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:
edit:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Bon je pense avoir trouvé:
Ç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)?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Partager