multiplication et overflow - ASM - Programmation
Marsh Posté le 23-01-2006 à 11:46:27
en 16bits:
mul/imul bx
ça fait: ax*bx (16bits*16bits) => dx:ax (32bits)
en 32bits:
mul/imul ebx
ça fait : eax*ebx (32bits*32bits) => edx:eax (64bits)
pour transformer un:
mul bx
en:
mul ebx
sur un assembleur 16bits, tu rajoutes "db 66h" qui est l'octet de préfixe pour basculer les opérandes en 32bits.
donc genre un:
db 66h
mul bx
fera un:
mul ebx.
par contre attention à la partie haute de ebx...
Marsh Posté le 23-01-2006 à 11:47:23
symétriquement, un:
db 66h
mov bx,[tartenpion]
fera un:
mov ebx,[tartenpion]
Marsh Posté le 23-01-2006 à 11:58:38
je vais voir, mais j'avais déjà essayer de travailler avec les registres EAX, EBX mais étant sous DOS, c'est registre n'existe pas.
Et je continue à chercher une méthode de calcul, quitte à devoir affiche mon résultat digit par digit ou par packet.
Mais je vais tout de même essayer ça merci
Marsh Posté le 23-01-2006 à 12:52:01
Citation : je vais voir, mais j'avais déjà essayer de travailler avec les registres EAX, EBX mais étant sous DOS, c'est registre n'existe pas. |
c'est faux sauf sur les 8086 80186 80286 8088 80188
sur les autres processeurs intel ou compatibles ces registres existent et sont employables même sous dos. Assemblé avec tasm, un programme dos 16 bits accepte les registres 32 bits et les opérations nouvelles si on met une directive .386 ou autre en en-tête.
Le processeur n'a pas d'état d'ame sur le système d'exploitation utilisé. La contrainte est le protocole de transaction avec le dit système.
Marsh Posté le 23-01-2006 à 13:03:32
op-hium a écrit : je vais voir, mais j'avais déjà essayer de travailler avec les registres EAX, EBX mais étant sous DOS, c'est registre n'existe pas. |
oui soit parceque l'assembleur est trop vieux ou que tu n'as pas la directive pour activer les registres et instructions du 386 (cf db__)
Marsh Posté le 23-01-2006 à 13:13:04
j'ai donc mis .386 en en-tête et changé une partie de mes AX, BX, ... en EAX, EBX, ... ainsi que mes variables de dw en dd mais maintenant lorsque je rentre un caractère au clavier, le programme plante
Marsh Posté le 23-01-2006 à 13:17:14
si il assemble c'est bon signe.
maintenant post le code...
Marsh Posté le 23-01-2006 à 14:04:15
je vais mettre le code qui tourne mais qui ne prend pas en compte l'overflow
Code :
|
Alors docteur, c'est grave ??
Marsh Posté le 24-01-2006 à 00:36:24
c'est bon j'ai résolu le problème en affichant caractère par caractère
Marsh Posté le 24-01-2006 à 02:11:43
encore de l'assembleur des années 20, pitié
Marsh Posté le 24-01-2006 à 12:15:27
Citation : encore de l'assembleur des années 20, pitié |
en 1920 on programmait déjà ?
Il me semble que le 8086 a du sortir vers 1980
Le masochisme est bien plus vieux et existe pourtant encore
FLNK
Marsh Posté le 24-01-2006 à 12:21:56
y'a un truc qui me tabasse : pkoi enseigne t'on encore de l'asm 16bits ? tous les sujets asm ouvert sont en 16bits, c'est quoi ce bins ?
Marsh Posté le 24-01-2006 à 12:39:00
bah on fait pas le programme nous
on ne fait que le subir
Marsh Posté le 24-01-2006 à 12:50:28
chrisbk a écrit : y'a un truc qui me tabasse : pkoi enseigne t'on encore de l'asm 16bits ? tous les sujets asm ouvert sont en 16bits, c'est quoi ce bins ? |
passke les profs en BTS/IUT ont un contenu de cours a forte inertie.... (et l'asm n'étant plus à la mode, ils se prennent pas la tête a revoir le contenu....)
passke ils font ça sous dos pour faire des TP de programmation de hardware...
passke ils ont pas de tasm plus récent pour faire du .386
passke qu'ils connaissent pas OpenWatcom ou DJGPP pour faire du mode protégé sous Dos...
passke sous win et linux ils font que du C/C++ et les IPCS (ce qui est bien déjà)...
Marsh Posté le 24-01-2006 à 13:28:55
op-hium > vi je sais bien que t'y es pour rien
bjone > ouais mais crotte quoi
Marsh Posté le 23-01-2006 à 01:11:17
Alors voilà, je dois faire une calculatrice en assembleur, l'utilisateur peut rentrer 2 entiers nombres compris en 0 et 9999 mais lorsque j'éxecute la multiplication, et que le résultat est supérieur ou égal à 65536 (soit 2^16 bits), j'ai tout naturellement un overflow et je n'arrive pas à résoudre mon problème.
Merci de votre aide
P.S.:J'ai remarqué que le résultat de la multiplication est le suivant 65536*DX + AX
Message édité par op-hium le 23-01-2006 à 01:45:52