Voici le bout de code qui résume les différents problèmes :
move.l d0,d2 ; *1 add.l d0,d0 ; *2 bvs.s \OverFlow lsl.l #3,d2 ; *8 bvs.s \OverFlow add.l d2,d0 ; 8+2 == 10 bvc.s \Loop \OverFlow:
L'idée, c'est que si le résultat du lsl dépasse 32 bits, on a un overflow. Mais la doc dit ça :
V - Set if the most significant bit was changed during the operation. Cleared else.
ie si j'ai $10000000, mon lsl va en faire un $80000000. Donc le most significant bit va changer durant l'opération, alors qu'en réalité, je n'aurai pas d'overflow. Comment faire ? Que des add, et tester à chaque fois l'overflow ?
Il y aurait bien ça :
move.l d0,d2 ; *1 add.l d0,d0 ; *2 bvs.s \OverFlow lsl.l #2,d2 ; *4 bcs.s \OverFlow ; Si add d0,d0 a marché, je peux avoir au pire un bit en trop ; Donc là si le bit #31 est 1, ça passera pas après add.l d2,d2 ; *8 bvs.s \OverFlow ; add.l d2,d0 ; 8+2 == 10 bvc.s \Loop \OverFlow:
Mais c'est lourd et crade, il n'y a pas moyen de faire mieux ?
(ps -> strtol, dans PedroM, c'est du C
