pseudo nul
Messages postés8Date d'inscriptionmardi 23 août 2005StatutMembreDernière intervention11 octobre 2005
-
4 oct. 2005 à 01:20
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 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
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 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>
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 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.
pseudo nul
Messages postés8Date d'inscriptionmardi 23 août 2005StatutMembreDernière intervention11 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+
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 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+
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 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
pseudo nul
Messages postés8Date d'inscriptionmardi 23 août 2005StatutMembreDernière intervention11 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
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 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.
pseudo nul
Messages postés8Date d'inscriptionmardi 23 août 2005StatutMembreDernière intervention11 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
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 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
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+
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 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.
pseudo nul
Messages postés8Date d'inscriptionmardi 23 août 2005StatutMembreDernière intervention11 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
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 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.