Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1443 connectés 

  FORUM HardWare.fr
  Programmation
  ASM

  [ASM] Convertir des DB -> DW

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[ASM] Convertir des DB -> DW

n°381608
Le Veilleu​r
Posté le 04-05-2003 à 12:23:37  profilanswer
 

Bonjour,
 
Je suis en train de faire un programme en assembeur, mais je me retrouve avec des db, et je voudrais les convertir en DW.
 
Je pensais faire comme ca

Code :
  1. CONVERTION MACRO IN,OUT
  2. PUSHA
  3. MOV  AH,0h
  4. MOV  AL,IN
  5. MOV  OUT,AX
  6. POPA
  7. ENDM CONVERTION


Mais ca n'a pas l'air d'etre tres correcte :(


Message édité par Le Veilleur le 04-05-2003 à 12:24:07

---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
mood
Publicité
Posté le 04-05-2003 à 12:23:37  profilanswer
 

n°381634
youdontcar​e
Posté le 04-05-2003 à 13:05:46  profilanswer
 

Le Veilleur a écrit :

Mais ca n'a pas l'air d'etre tres correcte :(

Ben si. Sauf pour conversion.
 
À partir du 386 tu peux utiliser movzx (move with zero extended) et movsx (move with sign extended).
 
movzx ax, al // ax = al si al est non signé
movsx ax, al // ax = al si al est signé

n°381683
Le Veilleu​r
Posté le 04-05-2003 à 13:51:57  profilanswer
 

merci,
Mais je ne comprends pas trop mon probleme
 
J'ai un db qui vaut 120, cette valeur est lue ds un fichier, j'ai verifier avec td, et cette valeur est bien à 120
 
Je veux donc convertir ce db en dw, avec ta méthode, ou bien ma macro, en sortie, je me trouve avec une variable dont la valeur est de "49<31h>" or qu'il devrait etre de 120
 
Je ne comprends pas trop :(


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
n°381685
youdontcar​e
Posté le 04-05-2003 à 13:57:22  profilanswer
 

Si tu as
 
mov al, 4
movzx bx, al
 
tu vas te retrouver avec bx = 4. Comment utilises-tu ta macro ? Donnes du code environnant.

n°381687
Le Veilleu​r
Posté le 04-05-2003 à 14:01:34  profilanswer
 

Code :
  1. MOV  AL,brAbsSup
  2. MOVZX AX,AL
  3. MOV  Temp1,AX


 
brAbsSup est en fait la l'abscisse Superieur du bouton rouge, cette valeur est sur 3 chiffre et elle est lue dans un fichier (la valeur est de 120, j'ai verifié avec turbo debugger et elle est correxte)
 
brAbsSup est defini comme ca

Code :
  1. brAbsSup DB  3 dup(?


 
et Temp1

Code :
  1. Temp1  DW  ?


 
 


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
n°381691
youdontcar​e
Posté le 04-05-2003 à 14:07:11  profilanswer
 

Le Veilleur a écrit :

[cpp]brAbsSup est en fait la l'abscisse Superieur du bouton rouge, cette valeur est sur 3 chiffre

db = un byte, pour stocker un nombre de 0 à 255 ou -128 à +127. Ta valeur rentre là-dedans sans problème.
 
brAbsSup contient 120 en représentation texte : le code ascii de 1 (49), de 2 (50), puis de 0 (48). Ta manip copie le premier byte (code 49) dans Temp1, c'est donc parfaitement logique.
 
Tu dois faire une fonction pour convertir texte -> entier.

n°381699
Le Veilleu​r
Posté le 04-05-2003 à 14:17:03  profilanswer
 

Ah...
Tu saurais m'expliquer comment je peux faire ca ?
merci


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
n°381701
youdontcar​e
Posté le 04-05-2003 à 14:24:20  profilanswer
 

caractère : '0', son code ascii : '48'
caractère : '1', son code ascii : '49'
caractère : '2', son code ascii : '50'
etc, jusqu'à
caractère : '9', son code ascii : '57'
 
Donc pour un caractère que tu lis : si son code est dans [48, 57] c'est un nombre. tu peux donc enlever 48 à son code pour trouver le nombre :
 
mov al, '5'
sub al, 48 (ou sub al, '0' si ça marche, me souviens plus)
/// al vaut maintenant 5
 
donc :
 
Tu boucles de gauche à droite sur ton code texte : 1, puis 2, puis 0. Il faut prendre en compte le décalage des dizaines.
 
variable résultat = 0
pour chaque nombre
  résultat = résultat*10 + nombre - '0'
 
Si on itère, on voit :
résultat = 0*10 + '1' - '0' = 1
résultat = 1*10 + '2' - '0' = 12
résultat = 12*10 + '0' - '0' = 120

n°381710
Le Veilleu​r
Posté le 04-05-2003 à 14:47:22  profilanswer
 

youdontcare a écrit :

caractère : '0', son code ascii : '48'
caractère : '1', son code ascii : '49'
caractère : '2', son code ascii : '50'
etc, jusqu'à
caractère : '9', son code ascii : '57'
 
Donc pour un caractère que tu lis : si son code est dans [48, 57] c'est un nombre. tu peux donc enlever 48 à son code pour trouver le nombre :
 
mov al, '5'
sub al, 48 (ou sub al, '0' si ça marche, me souviens plus)
/// al vaut maintenant 5
 
donc :
 
Tu boucles de gauche à droite sur ton code texte : 1, puis 2, puis 0. Il faut prendre en compte le décalage des dizaines.
 
variable résultat = 0
pour chaque nombre
  résultat = résultat*10 + nombre - '0'
 
Si on itère, on voit :
résultat = 0*10 + '1' - '0' = 1
résultat = 1*10 + '2' - '0' = 12
résultat = 12*10 + '0' - '0' = 120
 


ok, merci
 
Ca donnerait quelque chose comme ca alors ?
 

Code :
  1. MOV  Temp1,0
  2. MOV  AX,Temp1
  3. MUL  10
  4. MOV  BL,brAbsSup[0]
  5. SUB  BL,48
  6. MOVZX CX,AL
  7. ADD  AX,CX
  8. MOV  Temp1,AX


Message édité par Le Veilleur le 04-05-2003 à 14:48:19

---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
n°381712
youdontcar​e
Posté le 04-05-2003 à 14:53:21  profilanswer
 

* Tu ne fais rien avec bl :??: Tu as dû mettre movzx cx, al au lieu de bl.
 
* Manque une boucle (passer n chiffres)

mood
Publicité
Posté le 04-05-2003 à 14:53:21  profilanswer
 

n°381714
Le Veilleu​r
Posté le 04-05-2003 à 14:55:30  profilanswer
 

Pour le moment, à la bourrin ;)
Pour 3 caracteres a convertir en un chiffre
 

Code :
  1. PUSHA
  2. MOV  DX,10
  3. XOR  AX,AX
  4. MUL  DX
  5. MOV  BL,brAbsSup[0]
  6. SUB  BL,48
  7. MOVZX CX,BL
  8. ADD  AX,CX
  9. MUL  DX
  10. MOV  BL,brAbsSup[1]
  11. SUB  BL,48
  12. MOVZX CX,BL
  13. ADD  AX,CX
  14. MUL  DX
  15. MOV  BL,brAbsSup[2]
  16. SUB  BL,48
  17. MOVZX CX,BL
  18. ADD  AX,CX
  19. MOV  Temp1,AX
  20. POPA


 
edit: je me retrouver avec 0 ds temp1 :(


Message édité par Le Veilleur le 04-05-2003 à 15:00:05

---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
n°381716
youdontcar​e
Posté le 04-05-2003 à 15:01:28  profilanswer
 

Le Veilleur a écrit :

Pour le moment, à la bourrin ;)

:D
 

:non: Le résultat d'une multiplication 16 bits est un résultat 32 bits contenu dans dx:ax. Tu peux laisser mul 10.

n°381718
Le Veilleu​r
Posté le 04-05-2003 à 15:03:47  profilanswer
 

Qd je mets mul 10 a la place de DX
 
J'obtiens

Citation :

Arguments needs type override
Illegal Immediate


 :cry:


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
n°381720
youdontcar​e
Posté le 04-05-2003 à 15:10:51  profilanswer
 

:d

n°381722
chrisbk
-
Posté le 04-05-2003 à 15:11:49  profilanswer
 

Le Veilleur a écrit :

Qd je mets mul 10 a la place de DX
 
J'obtiens

Citation :

Arguments needs type override
Illegal Immediate


 :cry:  


 
ouais mul n'accepte pas d'operande "immediate" (constante quoi)
 
 

F6  /4  MUL AL,r/m8     9-14/12-17   Unsigned multiply (AX := AL * r/m byte)
F7  /4  MUL AX,r/m16    9-22/12-25   Unsigned multiply (DX:AX := AX * r/m
                                     word)
F7  /4  MUL EAX,r/m32   9-38/12-41   Unsigned multiply (EDX:EAX := EAX * r/m
                                     dword)



Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  ASM

  [ASM] Convertir des DB -> DW

 

Sujets relatifs
[ASM]Lecture clavier sans echo sans attente...[ASM] Où est passé Tasm ?
[ASM] Afficher un variable dwUn peu d'aide s'il vous plait ! (ASM)
convertir une appli access en VB[FORTRAN] convertir une chaine caractere en entier
[ASM] Création d'une DLL en MASM32 pour un client VB6[PHP] Convertir une valeur contenant un espace -> valeur avec %20
[VB] Comment convertir une image de 16M a 256 couleurs ?Programmation ASM sur Windows ?
Plus de sujets relatifs à : [ASM] Convertir des DB -> DW


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR