Convertir des DB -> DW [ASM] - ASM - Programmation
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é
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
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.
Marsh Posté le 04-05-2003 à 14:01:34
Code :
|
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 :
|
et Temp1
Code :
|
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.
Marsh Posté le 04-05-2003 à 14:17:03
Ah...
Tu saurais m'expliquer comment je peux faire ca ?
merci
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
Marsh Posté le 04-05-2003 à 14:47:22
youdontcare a écrit : caractère : '0', son code ascii : '48' |
ok, merci
Ca donnerait quelque chose comme ca alors ?
Code :
|
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)
Marsh Posté le 04-05-2003 à 14:55:30
Pour le moment, à la bourrin
Pour 3 caracteres a convertir en un chiffre
Code :
|
edit: je me retrouver avec 0 ds temp1
Marsh Posté le 04-05-2003 à 15:01:28
Le Veilleur a écrit : Pour le moment, à la bourrin |
Le Veilleur a écrit : MUL DX |
Le résultat d'une multiplication 16 bits est un résultat 32 bits contenu dans dx:ax. Tu peux laisser mul 10.
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 |
Marsh Posté le 04-05-2003 à 15:11:49
Le Veilleur a écrit : Qd je mets mul 10 a la place de DX
|
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) |
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
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