begin process at 2012 05 25 02:02:01
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive Assembleur

 > 

Archives

 > 

c, c++ et asm

 > 

afficher un nom en fonction d'un algo quelconque


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

afficher un nom en fonction d'un algo quelconque

mardi 4 octobre 2005 à 01:20:11 | afficher un nom en fonction d'un algo quelconque

pseudo nul

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


mardi 4 octobre 2005 à 08:19:00 | Re : afficher un nom en fonction d'un algo quelconque

Nasman

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

inc edi ; caractère suivant serial

dec ecx

jnz reverse


INVOKE SetDlgItemText, hWnd, IDC_SERIAL, ADDR sSerial



mardi 4 octobre 2005 à 10:56:23 | Re : afficher un nom en fonction d'un algo quelconque

Nasman

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.
mardi 4 octobre 2005 à 11:50:31 | Re : afficher un nom en fonction d'un algo quelconque

pseudo nul

 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+
mardi 4 octobre 2005 à 11:59:01 | Re : afficher un nom en fonction d'un algo quelconque

Nasman

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+

mercredi 5 octobre 2005 à 15:43:44 | Re : afficher un nom en fonction d'un algo quelconque

Nasman

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 

mercredi 5 octobre 2005 à 22:57:42 | Re : afficher un nom en fonction d'un algo quelconque

pseudo nul

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

jeudi 6 octobre 2005 à 09:21:12 | Re : afficher un nom en fonction d'un algo quelconque

Nasman

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+

jeudi 6 octobre 2005 à 22:43:25 | Re : afficher un nom en fonction d'un algo quelconque

pseudo nul

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+
vendredi 7 octobre 2005 à 09:27:50 | Re : afficher un nom en fonction d'un algo quelconque

Nasman

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



1 2

Cette discussion est classée dans : afficher, name, serial, edi, esi


Répondre à ce message

Sujets en rapport avec ce message

[ASM] Strcmp, prob evec la valeur de retour. [ par Ilsundal ] Bonjour a tous, j'ai réaliser la fonction strlen en ASM x86. tout fonctionne parfaitement sauf pour la valeur de retour, je souhaiterait qu'elle corre Comment utiliser une variable ?! lorsque l'on utilise déjà ESI et EDI dans la PROC. [ par rebixav ] Voilà mon problème, je débute en assembleur et je l'utilise essentiellement pour créer des procédure pour visual basic ou C voici une de mes procédure Recherche de fichier recursif [ par maximus4 ] Bonjour, j'ai la procédure suivante pour la recherche récursive, le résultat est stocké dans un fichier texte. [code=autre]invoke CreateFile,offset fi saisie une taille d'une ligne qu'on doit afficher [ par eishtein ] salut les camarades; pouvez vous m'aider à savoir comment afficher [selon la convention 16 bits] une ligne dans l'ecran à partir d'une taille saisie a programme assembleur (TASM) capable de saisir et d'analyser une chaine de caractéres? [ par chester89 ] Slt tt le monde [^^drapeaublanc] Aide moi a ecrire un programme assembleur qui charge ue chaine de caractere en leur memoire central puis il fait ce t Program received signal SIGFPE,Arithmetic exception. [ par petitete ] Bonjour!! J'aimerais solliciter votre aide pour me débloquer. Je dois écrire un programme en nasm pour connaître le nombre d'éléments pairs et impairs une grille différente [ par mathy11 ] J'ai pu enfin afficher ma grille en assembleur 8086 , maintenant j'ai vraiment besoin de savoir comment je peux afficher une nouvelle grille de différ EditBox [ par Bros ] SalutJ'ai une fenetre avec un editbox.Mon programme ouvre un fichier et va afficher dans l'édit box: "Fichier ouvert..."En suite a la ligne en dessous Afficher une image / MSDOS [ par frolow ] FrölöwBonjours Ô programmeur!J'aurai besoin d'une source qui m'expliquerai comment d'une part afficher une image à l'écran sous msdos. Mais aussi comm 512 bps port serial [ par abarbu ] est il possible sous Windows (9x ou XP) que je programme le 8253 timer pour obtenir 512 Hz e user ce frequence pour le port serialle (RS232) ?Sous DO


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,045 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales