Division, echec.

Signaler
Messages postés
41
Date d'inscription
mardi 8 mai 2007
Statut
Membre
Dernière intervention
4 octobre 2012
-
Messages postés
559
Date d'inscription
jeudi 28 novembre 2002
Statut
Non membre
Dernière intervention
27 octobre 2020
-
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

Messages postés
559
Date d'inscription
jeudi 28 novembre 2002
Statut
Non membre
Dernière intervention
27 octobre 2020
2
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.
Messages postés
41
Date d'inscription
mardi 8 mai 2007
Statut
Membre
Dernière intervention
4 octobre 2012

Merci, je vais faire des recherches... pour y arrivé maintenant que j' ai une direction
Messages postés
559
Date d'inscription
jeudi 28 novembre 2002
Statut
Non membre
Dernière intervention
27 octobre 2020
2
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
Messages postés
41
Date d'inscription
mardi 8 mai 2007
Statut
Membre
Dernière intervention
4 octobre 2012

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 ^^.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
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++
Messages postés
559
Date d'inscription
jeudi 28 novembre 2002
Statut
Non membre
Dernière intervention
27 octobre 2020
2
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.