Nasm,nasm,nasm

Résolu
cs_qsdfgh Messages postés 29 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 30 mars 2006 - 28 mars 2006 à 18:00
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 - 30 mars 2006 à 09:58
voula je veux faire une fonction en asm avec nasm (vous
l'auriez deviné ) qui affiche une chaine de caracteres a partie d'une
fonction qui affiche un registre :



SECTION .data



; variables du programme



x: TIMES N dd 0

y: TIMES N dd 0

z: TIMES N*4 dd 0

bonjour_ db 'bonjour',0 ; le zero indique la fin



SECTION .text



main:







Mov bx,bonjour

call cout_msg



cout_msg:

Mov eax,[bx]

PUSHA

PUSH EAX

CALL afficherUns32 ;affiche eax

POP EAX

POPA

inc bx

cmp [bx],word 0

jne cout_msg

ret

3 réponses

cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
30 mars 2006 à 09:58
Bonjour qsdfgh,

Voici une routine qui convertit un octet mis dans al en deux caractères mis dans ax

hexascii: ;convertit la valeur mise dans al en 2 octets al et ah (al=poids fort, ah=poids faible)


aam 16 ;décompose en deux octets ah (division par 16) et al (reste division)
;peut être remplacé par mov ah,al et shr al,4 si pb (MASM)
cmp al,0x9 ;vérifie si numérique
jna num1 ;si <=9
add al,"A"-"0"-10 ;sinon ajoute 7
num1 xchg ah,al ;lit les 4 bits de poids fort
cmp al,0x9
jna num2
add al,"A"-"0"-10
num2 add ax,"00" ;rajoute "0"-0 à chacun des octets
ret

Si tu veux utiliser ta routine afficherUns32, il faut que tu ne mette qu'un octet dans eax. Il faut utiliser l'instruction
movzx eax,byte[bx]
qui va copier un octet dans eax (en faut dans al et mettre ah et les autres bits du registre à 0)


Si la routine afficherUns32 travaille avec 4 octets (ceux de eax) alors il te faut incrémenter bx de 4.
Une question : dans ce dernier cas que se passera-t-il si le nombre de caractères de ta chaine n'est pas un multiple de 4.

Enfin - et le plus grave - la fonction afficherUns32 doit convertir une valeur hexa comprise entre 00 et FF (pour un octet) en deux caractères, ceci nécessite les opérations suivantes :
- division par 16 pour extraire le nibble haut (bits de 4 à 7) et le nibble bas (bit de 0 à 3)
- pour un résultat compris entre 0 et 9 il faut rajouter 30h pour obtenir les codes ascii compris entre 30h ("0") et 39h ("9")
- pour un résultat compris entre A et F il faut rajouter 37h pour obtenir les codes ascii compris entre 41h ("A") et 46h ("F") ou rajouter 57h pour les minuscules

- sortir la chaine de caractères obtenue

Dans le cas de la sortie d'une chaine déjà toute faite, ta chaine bonjour, ta routine n'est pas du tout adaptée.
Sous Windows, utilise plutôt l'API MessageBox qui t'affichera directement ta chaine

A+
3
cs_Nasman Messages postés 202 Date d'inscription mardi 17 mai 2005 Statut Membre Dernière intervention 29 septembre 2008 3
29 mars 2006 à 08:45
Bonjour qsdfgh,

Ta question n'est pas très claire, veux tu savoir quoi mettre dans la fonction afficherUns32 ou bien la fonction afficherUns32 existe déjà et tu veux l'utiliser pour afficher une chaine de caractères ?


Je pense également que le code que tu as mis comporte quelques coquilles comme:


bonjour_ db 'bonjour',0 ; le zero indique la fin (je suppose que c'est bonjour: db ...)

Pourquoi utilises-tu le registre 16 bits bx.


Enfin je ne sais pas ce qu'il y a dans la routine afficherUns32, affiche-t-elle un ou plusieurs caractères à la fois (pour les 4 octets de eax) ? Dans ce cas l'incrémentation de 1 de bx décale la lecture de ta chaine de 1 caractère seulement. Tu aurais dans ce cas:


bonjonjonjoujouroururr


A+
0
cs_qsdfgh Messages postés 29 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 30 mars 2006
30 mars 2006 à 08:48
cette fonction affiche le code ascii qui est dans eax

je ne sais pas comment elle fonctionnne et je veux l'utiliser pour

afficher une chaine de caracterese enmetant l'addresse de cette chaine dans bx ou ebx , mais nasm me dit q'il y a une faute
0
Rejoignez-nous