afficher un nom en fonction d'un algo quelconque

pseudo nul Messages postés 8 Date d'inscription mardi 23 août 2005 Statut Membre Dernière intervention 11 octobre 2005 - 4 oct. 2005 à 01:20
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 - 10 oct. 2005 à 09:14
bonjour
comment modifier ce bout de code en masm 32 pour faire afficher dans la case serial (edi) un numéro de serie en faisant la somme de la valeur ascii de chaque caractères du nom (esi)
; par exemple : name=pseudo
serial=290h


lea esi, sName ; mon name
lea edi, sSerial ; un numero se serie en fonction de mon name
mov ecx, eax ; nombre de caractères


reverse:


mov al, byte ptr[esi] ; adresse name


mov byte ptr[edi], al ; adresse serial


inc esi ; caractere suivant name


inc edi ; caractère suivant serial


dec ecx


jnz reverse


mov byte ptr[edi], 0


INVOKE SetDlgItemText, hWnd, IDC_SERIAL, ADDR sSerial

je vous remercie d'avance

14 réponses

cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
4 oct. 2005 à 08:19
Bonjour,



Si j'ai bien compris le code (je travaille plutôt avec Nasm), le bout
de code recopie les codes ascii de name dans serial et n'effectue pas
la somme des caractères. La faute en est à l'instruction inc edi qui
décale d'une position (octet) l'endroit où sera stocké le code ascii.

Il faudrait supprimer cette instruction et effectuer effectivement une somme avec l'instruction add



lea esi, sName ; mon name
lea edi, sSerial ; un numero se serie en fonction de mon name
mov byte ptr[edi], 0

mov ecx, eax ; nombre de caractères



reverse:



mov al, byte ptr[esi] ; adresse name



add byte ptr[edi], al ; adresse serial



inc esi ; caractere suivant name



<strike>inc edi ; caractère suivant serial</strike>



dec ecx



jnz reverse








INVOKE SetDlgItemText, hWnd, IDC_SERIAL, ADDR sSerial
0
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
4 oct. 2005 à 10:56
Il faut apporter un correctif à ce que j'ai mis précédemment. En effet add byte
ptr[edi], al n'effectuera l'addition que sur un octet. Tu risques de
dépasser très rapidement la valeur de 255d (FFh). Si tu n'autorises
qu'un nombre maxi de 256 caractères, ta somme tiendra dans un word. Il
te faut initialiser tes deux octets à zéro avec

mov word ptr[edi], 0



puis ajouter au word pointé par edi



add word ptr[edi], al ; adresse serial



Pour la restitution du résultat il te faudra convertir ton résultat
numérique (en hexa) en une chaine de caractère à afficher (soit de
l'hexa - et donc 4 caractères pour un word, soit en décimal - avec
calcul de conversion hexa-décimal).



Si tu t'affranchis de cette dernière étape, tu auras sans doute de
nombreux caractères non imprimables. La valeur 0A0Dh te renverra un
retour à la ligne par exemple.
0
pseudo nul Messages postés 8 Date d'inscription mardi 23 août 2005 Statut Membre Dernière intervention 11 octobre 2005
4 oct. 2005 à 11:50
bonjour tout le monde
merci nasman de m'avoir répondu rapidement
oui c'est exactement cela
dans la case serial je voudrais voir apparaitre 290 en hexa .Donc comme tu le préconise il faut effctuer un conversion .Comment dois-je programmer cette routine?
J'ai trouver un peu de lecture sur le sujet mais j'ai pas compris grand chose!
A+
0
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
4 oct. 2005 à 11:59
Tu peux d'inspirer de ma première source qui utilise une routine de
conversion hexa/chaine de caractères. Tu devra convertir l'octet de
poids fort du word (deuxième octet) en deux caractères puis l'octet de
poids faible en deux autres caractères puis rajouter un octet nul pour
terminer la chaine de caractères à afficher.



A+
0

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

Posez votre question
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
5 oct. 2005 à 15:43
Voici une variante de routine qui transforme un octet placé dans al en
deux caractères placés dans ax. L'octet al contient au retour le
caractère correspondant aux 4 bits de poids fort de l'octet d'origine
et l'octet ah correspond aux bits de poids faible. Ainsi en écrivant ax
dans une chaine les 4 bits de poids fort seront écrits les premiers.



Par exemple si al contient la valeur 3E



aam 16
; effectue une
division par 16d



; ah contiendra 3 (quotient)



; et al E (reste)

cmp al,9 ;

jna num1
; E est >9 (de A à F) il faut
ajouter 7

add al,7
; al contient alors 15h

num1 xchg al,ah ; permute al et ah - ah contient désormais 15h et al 3h

cmp al,9 ;

jna num2
; 3<=9 (de 0 à 9) pas
d'ajout

add al,7

num2 add ax,3030h ; rajoute 30h à chacun des deux octets



; al contient 33h ("3") et ah contient 45h ("E")



;la chaine formée par ax donne donc "3E"



PS: cette routine fait 20 octets - Peut-on faire moins
0
pseudo nul Messages postés 8 Date d'inscription mardi 23 août 2005 Statut Membre Dernière intervention 11 octobre 2005
5 oct. 2005 à 22:57
salut


j'ai essayé de transposé en masm en fonction de ton source mais je rencontre des problèmes de syntaxe et/ou des instructions illégales.
Par exemple :
mov word ptr[edi], 0 ----> il n'en veut

Dans l'aide de masm l'instruction à pourtant l'air d'être valable
0
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
6 oct. 2005 à 09:21
Bonjour Pseudo nul,



Je ne suis pas très familier de la syntaxe de Masm. Quel est le type
d'erreur que tu rencontre, est-ce à la compilation ou à l'exécution.

Par ailleurs l'utilisation du registre edi peut causer problème avec
Windows car ce registre est également utilisé par le système. Tu dois
le sauvegarder avant tout changement et le restaurer après usage. Je ne
sais pas si ceci est la cause de ton problème ou si c'est réellement un
problème de syntaxe.

Tu devrais également vérifier (en cas de plantage à l'exécution) qu'elle est la valeur de edi.



A+
0
pseudo nul Messages postés 8 Date d'inscription mardi 23 août 2005 Statut Membre Dernière intervention 11 octobre 2005
6 oct. 2005 à 22:43
bonsoir
bon j'ai essayé quelque modifs mais c'est pas concluant .Plus j'avance et moi je comprends.
je bloque toujours au niveau des conversions.
Je crois qu'un exemple complet serais le bien venu pour illustrer tout cela


; Generation routine


lea esi, sName


lea edi, sSerial


mov ecx, eax


mov word ptr[edi],0


reverse:


mov ax, word ptr [esi]


aam ; ici j'ai un probleme avec la syntaxe masm


; ah contiendra 3 (quotient)


; et al E (reste)


cmp al,9 ;


jna num1 ; E est >9 (de A à F) il faut ajouter 7


add al,7 ; al contient alors 15h


num1 : xchg al,ah ; permute al et ah - ah contient désormais 15h et al 3h


cmp al,9 ;


jna num2 ; 3<=9 (de 0 à 9) pas d'ajout


add al,7


num2 : add ax,3030h ; rajoute 30h à chacun des deux octets


; al contient 33h ("3") et ah contient 45h ("E")


;la chaine formée par ax donne donc "3E"


add word ptr[edi],ax


inc edi


dec ecx


jnz reverse


INVOKE SetDlgItemText, hWnd, IDC_SERIAL, ADDR sSerial

A+
0
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
7 oct. 2005 à 09:27
Bonjour,



Deux erreurs (au moins) apparaissent dans ton code. Les voici :



- l'instruction aam fonctionne avec un paramètre qui est le diviseur ; dans mon code il faut préciser la valeur 16(en décimal) ou 10h(hexa)
qui a pour but de séparer l'octet à convertir en deux octets al et ah
correspondant aux 4 bits de poids faible et fort. A la compilation tu
auras deux opcodes, l'un pour aam (D4) et l'autre pour le diviseur.
Avec Nasm si on ne précise pas le diviseur, le diviseur est fixé à
10(décimal) ou A(hexa) ce qui ne convient pas (les deux opcodes
seraient D4 0A - alors qu'il te faut D4 10).



- la routine de conversion hexa-ascii n'est à effectuer que lorsque le
serial aura déjà été calculé (somme des octets). Elle sert à
l'affichage du word qui sera obtenu.

Tu mettras l'octet de poids faible de ce word dans al avant d'appeler
la routine (mettre ret si tu l'utilise en tant que sous programme) et
tu sauvegarderas ax à l'emplacement chaine (al en chaine+2 et ah en
chaine+4).

Tu recommences avec l'octet de poids fort de ton word (mettre dans al
et appeler la routine) et sauvegarde au retour ax dans chaine (al dans
chaine et ah dans chaine+1)

Au global ton word aura été converti en 4 octets correspondant aux 4
caractères ascii. Il suffira te terminer ta chaine par un octet zéro
(dans chaine+4)



Voici ton code après quelques corrections

; Generation routine



lea esi, sName

lea edi, sSerial


mov ecx, eax
;je suppose que eax contient le nombre de caractères


mov word ptr[edi],0 ;initialisation à
zéro







addition movzx ax, byte ptr [esi] ;convertit l'octet lu en un word


add word ptr[edi],ax ;le
rajoute au serial en cours d'écriture

inc esi


loop addition,ecx ;effectue l'addition
tant qu'il reste des caractères




mov al, byte ptr[edi] ;lit l'octet de poids faible du
serial

call hexascii

mov offset [chaine+2],ax

inc edi


mov al, byte ptr[edi] ;lit l'octet de poids fort du
serial


call hexascii


mov offset [chaine],ax


mov offset [chaine+4],byte 0 ;zero terminal



INVOKE SetDlgItemText, hWnd, IDC_SERIAL, ADDR chaine











hexascii:

aam 10h
;syntaxe NASM-quel est le message d'erreur de Masm ?


cmp al,9

jna num1 ; E est >9 (de A à F) il faut ajouter 7

add al,7 ; al contient alors 15h

num1: xchg al,ah ; permute al et ah

cmp al,9

jna num2

add al,7

num2 : add ax,3030h ; rajoute 30h à chacun des deux octets

ret





data?

chaine réserver 5 octets ; je ne me souviens pas de la syntaxe de Masm
0
pseudo nul Messages postés 8 Date d'inscription mardi 23 août 2005 Statut Membre Dernière intervention 11 octobre 2005
7 oct. 2005 à 13:47
bonjour à toutes et a tous
salut nasm c'est plus limpide mais il y a encore des problemes :
***********************************

; Generation routine


lea esi, sName


lea edi, sSerial


mov ecx, eax ;eax contient le nombre de caractères


mov word ptr[edi],0 ;initialisation à zéro


addition:


movzx ax, byte ptr [esi] ;convertit l'octet lu en un word


add word ptr[edi],ax ;le rajoute au serial en cours d'écriture


inc esi


loop addition ;effectue l'addition tant qu'il reste des caractères


mov al, byte ptr[edi] ;lit l'octet de poids faible du serial


call hexascii


mov offset [chaine+2],ax


inc edi


mov al, byte ptr[edi] ;lit l'octet de poids fort du serial


call hexascii


mov offset [chaine],ax


mov offset [chaine+4],byte 0 ;zero terminal


INVOKE SetDlgItemText, hWnd, IDC_SERIAL, ADDR chaine


hexascii:


aam ;syntaxe NASM-quel est le message d'erreur de Masm ?


cmp al,9


jna num1 ; E est >9 (de A à F) il faut ajouter 7


add al,7 ; al contient alors 15h


num1: xchg al,ah ; permute al et ah


cmp al,9


jna num2


add al,7


num2 : add ax,3030h ; rajoute 30h à chacun des deux octets


ret


********************************************************************

A la compilation j'ai les erreures suivantes:

************************************************************


Assembling: keygen.asm


keygen.asm(423) : error A2001: immediate operand not allowed


keygen.asm(427) : error A2001: immediate operand not allowed


keygen.asm(428) : error A2206: missing operator in expression


Microsoft (R) Incremental Linker Version 5.12.8078


Copyright (C) Microsoft Corp 1992-1998. All rights reserved.


LINK : fatal error LNK1181: cannot open input file "keygen.obj"


Appuyez sur une touche pour continuer...

*************************************************************
Ensuite masm refuse que l'on mette un diviseur pour l'instruction aam.
J'ai reservé 5 octets pour la chaine : chaine CHAR 30h dup(?)

Petite question: pourquoi avoir choisi nasm plutôt que masm?

Merci de me consacrer un peu de ton temps et de ta patience.
ça fait seulement quleques jours que j'essaie de me mettre à programmer dans ce langage
A+
0
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
7 oct. 2005 à 15:28
Bonjour Pseudo nul,



Pour répondre à tes questions:

- pour résoudre le problème de l'instruction aam, peux tu voir ce que donne le désassemblage des deux octets D4 10 avec Masm.

Tu peux créer un fichier avec un editeur hexa et le desassembler avec
Masm, tu verra quelle est la syntaxe de Masm - à supposer qu'il accepte
d'assembler ce qu'il a désassemblé !

Bien qu'il soit possible de choisir le diviseur pour aam, debug ne le
prend pas à l'assemblage mais le désassemble correctement. A
l'exécution il n'y a pas de pb



J'ai choisi Nasm principalement parce qu'il est gratuit, relativement
simple et pour ne pas être inféodé à M$. Il est malheureusement
difficile d'échapper aux API Windaube



Voici un bout de programme assemblé puis désassemble par Nasm



mov al,3Eh

aam 10h ;syntaxe NASM-quel est le message d'erreur de Masm ?

cmp al,9

jna num1 ; E est >9 (de A à F) il faut ajouter 7

add al,7 ; al contient alors 15h

num1: xchg al,ah ; permute al et ah

cmp al,9

jna num2

add al,7

num2 : add ax,3030h ; rajoute 30h à chacun des deux octets

mov [Texte],ax

mov [Texte+2],byte 0





00000400 B03E mov al,0x3e

00000402 D410 aam 0x10

00000404 3C09 cmp al,0x9

00000406 7602 jna 0x40a

00000408 0407 add al,0x7

0000040A 86C4 xchg al,ah

0000040C 3C09 cmp al,0x9

0000040E 7602 jna 0x412

00000410 0407 add al,0x7

00000412 66053030 add ax,0x3030

00000416 66A317204000 mov [0x402017],ax

0000041C C6051920400000 mov byte [0x402019],0x0



Pour les erreurs des lignes 423,427 et 428, je ne peux rien dire car je
ne sais pas ce qu'elles contiennent (il faudrait un listing avec les n°
de lignes.



Bon courage
0
pseudo nul Messages postés 8 Date d'inscription mardi 23 août 2005 Statut Membre Dernière intervention 11 octobre 2005
7 oct. 2005 à 17:48
salut
euh il me semble que Masm32 est gratos non?

Pour l'instruction aam me donne : 4D0A
0
pseudo nul Messages postés 8 Date d'inscription mardi 23 août 2005 Statut Membre Dernière intervention 11 octobre 2005
7 oct. 2005 à 19:28
whyyyyy!!!! il me fait des misères
erreur 523 ---> mov al, byte ptr[edi] ;lit l'octet de poids faible du seria
call hexascii
mov offset [chaine+2],a
inc edi


erreur 527 ---> mov al, byte ptr[edi] ;lit l'octet de poids fort du serial


erreur 528 ---> call hexasci
mov offset [chaine],ax
mov offset [chaine+4],byte 0 ;zero terminal
0
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
10 oct. 2005 à 09:14
Bonjour Pseudo nul,



Comme je te l'ai dit, je ne suis pas trop familier de la syntaxe Masm,
aussi des erreurs de transcription sont possibles. Néanmoins:

erreur 523: je pense que la syntaxe est correcte (on
cherche à connaitre la valeur de l'octet pointé par edi). Par
contre il faut vérifier que ce registre est bien sauvegardé car il est
également utilisé par windows. Je pense que l'erreur doit apparaitre à
l'exécution et la valeur de edi fait pointer sur une adresse interdite
par windows. Il faut vérifier sa valeur avant l'instruction mov al, byte ptr[edi].



erreur 527: A priori même problème que 523



Pour la sauvegarde dans une chaine, je crois que la syntaxe à adopter serait:

mov [offset chaine+2],ax

...

mov [offset chaine],ax

...

mov [offset chaine+4],byte 0



Par ailleurs, as-tu essayé de désassembler les deux octets D4 10 ?



Je pense que tu peux créer un bout de programme avec la structure suivante:



inst1 ;une instruction quelconque

inst2 ;d'autres instructions

db D4h,10h

inst3 ;retour à du code



Au désassemblage tu devrais retrouver tes instructions inst1, inst2, aam 10h, inst3.

Tu peux commencer par mettre db D4h,0Ah qui devrait te donner aam.



A propos, je pense que le désassemblage de aam est D4 0A et non pas 4D 0A.
0
Rejoignez-nous