Division, echec.

vincent2795 Messages postés 41 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 4 octobre 2012 - 2 oct. 2012 à 12:31
ToutEnMasm Messages postés 591 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 - 5 oct. 2012 à 10:00
le résultat n'ai pas bon et je ne trouve pas ou est le problème.


.data?
resultat db	128 dup (?)
szKeyBuffalfModulus	db	128 dup (?)
.data
N0 db "340376858070",0
; 340376858070/9=37819650896,66667
; 9-6=3
insert db "%s%lu",0
.code
invoke lstrcpy, addr szKeyBuffalfModulus,addr N0
mov eax,offset szKeyBuffalfModulus ;met les chiffres ds eax 
push 9h                             ; met 9h sur la pile
cdq                                ; met edx a zero
pop ebx                             ; met 9h dans ebx ( le reste ce trouve dans edx)
idiv ebx			; divise eax par ebx result ds edx 
sub ebx,EDX ; soustrait le modulo a ebx (ici "9-?")
push ebx

invoke wsprintf,addr  resultat,addr insert,addr N0,ebx ; met le resultat de la soustraction apres N0 et dans la var result
; EXB = 3

6 réponses

ToutEnMasm Messages postés 591 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
3 oct. 2012 à 06:13
Une légère confusion entre nombre hexadécimaux et format ascii est à l'origine de l'erreur.
db "34",0 == 3034h
Pour faire des calculs sur un nombre,il faut d'abord le transformer de sa forme texte (ascii) en une forme hexadecimal (la seule comprise par le processeur).
idiv est une division signé
div division non signé.
Içi le nombre est non signé.
Voir le codage des nombres signés.
0
vincent2795 Messages postés 41 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 4 octobre 2012
3 oct. 2012 à 09:03
Merci, je vais faire des recherches... pour y arrivé maintenant que j' ai une direction
0
ToutEnMasm Messages postés 591 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
3 oct. 2012 à 14:33
un petit exemple:


nombre db "345",0
resultat db "resultat :"
tampascii db 10 dup (0)
titre db " reste de la division :"
reste db 10 dup (0)
.code

start:
;---- code here --------
invoke atodw,addr nombre ;converti ascii to headecimal,fonction masm32
;resultat dans eax
mov edx,0 ;essayer de mettre un nombre 56987h,par exemple,resultat garanti
mov ecx,2
div ecx ;divise edx:eax par 2,reste dans edx
push edx
invoke dwtoa,eax,addr tampascii ;hexadecimal vers ascii
pop edx
invoke dwtoa,edx,addr reste ;hexadecimal vers ascii

invoke MessageBox,NULL,ADDR resultat,addr titre,MB_OK
0
vincent2795 Messages postés 41 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 4 octobre 2012
4 oct. 2012 à 14:36
Exemple utile.
dans mon car la chaine est trop longue de 2 caractères ascii.
donc pour atodw sa ne marche pas, ca me donne un faux résultat.
ps: bien joué pour la variable qui ne ce termine pas part ',0'
j'ai encore beaucoup a apprendre ^^.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 oct. 2012 à 23:26
Défrichons un peu...

La forme hexadecimale est aussi un format texte.
MASM ou autre assembleur le transforme en BINAIRE, seul format pour CPU et copro associés.

ASCII (étendu qui est la norme depuis des lustres) détermine qu'on met 1 caractère (au sens large) par octet (8 bits), donc plage 0 <=> 255. Ascii ne présume aucun format de ce que contient la chaine de caractères.

Exemple:
N0 db "340",0
N0 est ici en ascii et représente le nombre 340 en format base10.
Un nombre 32 bits calculable serait:
N0 DW 340


ciao...
BruNews, MVP VC++
0
ToutEnMasm Messages postés 591 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
5 oct. 2012 à 10:00
Pour transcrire une chaine litterale de longueur quelconque contenant des chiffres,il faut simplement faire appel a la definition d'une base,exemple (p=puissance):
495 = 4*10p2 + 9*10p1 +5*10p0
Le système est valable pour toutes les bases.
Il suffit de le faire.
0