[ASM] Convertir des DB -> DW

Convertir des DB -> DW [ASM] - ASM - Programmation

Marsh Posté le 04-05-2003 à 12:23:37    

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
Reply

Marsh Posté le 04-05-2003 à 12:23:37   

Reply

Marsh Posté le 04-05-2003 à 13:05:46    

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é

Reply

Marsh Posté le 04-05-2003 à 13:51:57    

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
Reply

Marsh Posté le 04-05-2003 à 13:57:22    

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.

Reply

Marsh Posté le 04-05-2003 à 14:01:34    

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
Reply

Marsh Posté le 04-05-2003 à 14:07:11    

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.

Reply

Marsh Posté le 04-05-2003 à 14:17:03    

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


---------------
Mon Blog : LeVeilleur.net | Hébergement d'images : Hostipics.net
Reply

Marsh Posté le 04-05-2003 à 14:24:20    

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

Reply

Marsh Posté le 04-05-2003 à 14:47:22    

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
Reply

Marsh Posté le 04-05-2003 à 14:53:21    

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

Reply

Marsh Posté le 04-05-2003 à 14:53:21   

Reply

Marsh Posté le 04-05-2003 à 14:55:30    

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
Reply

Marsh Posté le 04-05-2003 à 15:01:28    

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.

Reply

Marsh Posté le 04-05-2003 à 15:03:47    

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
Reply

Marsh Posté le 04-05-2003 à 15:10:51    

:d

Reply

Marsh Posté le 04-05-2003 à 15:11:49    

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)


Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed