Déclarations des variables en ASM

over flow Messages postés 1 Date d'inscription jeudi 11 décembre 2003 Statut Membre Dernière intervention 14 décembre 2003 - 14 déc. 2003 à 11:11
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 - 5 janv. 2004 à 02:34
Bonjour,
J'ai un petit problème. Je dois réaliser un prog qui demande à l'user 4 nb hexa (5C6F) par exemple. Il doit inscrire cela dans DX, donc 5C dans DH et 6F dans DL. 2 problèmes se posent : a) la variable que j'utilise pour stocker mon premier nombre est var1, le deuxième est var2. Cependant, il me dit que mes variables ne sont pas déclarées, pourtant c'est ce que je fais au debut du programme :shock) b) je fais "mov dh,var1" pour mettre le contenu de la var1 dans DH, met je n'y met que mon premier digit entré, j'aimerai également y mettre le deuxième :question)
Mon programme est le suivant :
----------------------------------------------------------------
.MODEL small
.STACK
.DATA
acMsg1 db "Entrer nb hexadecimal a 4 digits : $"
acExpression DB 7,?,4 DUP(" ")
var1 DB ?
var2 DB ?
.CODE
mov ax,@DATA
mov ds,ax

; lecture des digits entrés
lea dx,acExpression
mov ah,0Ah
int 21h

;met les deux premiers digits hexa entres dans DH
mov si,2 ; déplace le pointeur sur la case mémoire 2
mov var1,[si] ; prend le contenu de la case pointée par
le pointeur et met dans var1
mov si,3 ; déplace le pointeur sur la case mémoire 3
mov var2,[si] ; prend le contenu de la case pointée par le
pointeur et met dans var2
mov dh,var1 ; prend le contenu de la variable var1 et
l'inscrit dans dh
-----------------------------------------------------------------
Merci d'avance !
O.v.E.r.F.l.O.w.

2 réponses

hitchhikr Messages postés 36 Date d'inscription dimanche 8 décembre 2002 Statut Membre Dernière intervention 8 avril 2005
22 déc. 2003 à 10:26
Remplace:

acExpression DB 7,?,4 DUP(" ")
var1 DB ?
var2 DB ?


Par:

; (5 pour le retour chariot)
acExpression db 5,0
acTampon db 5 dup (" ")
var1 db 0
var2 db 0
; Cette table permet de convertir rapidement
; une valeur ASCII hexdécimale en binaire
tabhex db 0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,0ah,0bh,0ch,0dh,0eh,0fh


et:

mov si,2 ; déplace le pointeur sur la case mémoire 2
mov var1,[si] ; prend le contenu de la case pointée par 
le pointeur et met dans var1
mov si,3 ; déplace le pointeur sur la case mémoire 3
mov var2,[si] ; prend le contenu de la case pointée par le
pointeur et met dans var2
mov dh,var1 ;


par:

; Note: à toi de verifier que l'utilisateur a bien entré des caractères
; valides (de 0 à 9 et de A à F).
; Le principe est assez simple, on doit convertir les données entrées
; par l'utilisateur de l'ascii vers le binaire avant de pouvoir les enregistrer
; dans des variables.
lea di,tabhex    ; Table de conversion ASCII->Binaire
lea si,acTampon
xor bx,bx        ; On efface bx pour eviter les mauvaises surprises
mov bl,[si]
sub bl,"0"       ; Retranche 030h ("0") pour obtenir un indice dans la table
; Et utilise la table pour obtenir la bonne valeur en binaire
; car "A" n'est pas égal à 0Ah après avoir soustrait "0"
mov dh,[di+bx]
shl dh,4         ; Décale le chiffre obtenu: 0X -> X0
inc si           ; Deuxième chiffre entré
mov bl,[si]
sub bl,"0"
or dh,[di+bx]    ; Ajoute 0X
mov var1,dh    ; Premier nombre convertit

inc si           ; On passe au deuxième nombre (Troisième chiffre)
mov bl,[si]
sub bl,"0"
mov dl,[di+bx]
shl dl,4
inc si
mov bl,[si]
sub bl,"0"
or dl,[di+bx]
mov var2,dl

; Ici , var1/var2 sont déjà dans dh/dl
;mov dh,var1 
;mov dl,var2


-------
Note:
La mode d'adressage "mémoire vers mémoire" n'existe pas avec l'instruction mov (mov var1,[si] / mov var2,[si] est impossible).

Note bien que je n'ai pas testé ce code mais je pense qu'il devrait fonctionner :) Le plus important à savoir est qu'il faut convertir les données de l'ascii vers le binaire.

Voila, bon courage.

f.
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
5 janv. 2004 à 02:34
Remplace juste:
mov var1,[si]

Qui est une instruction qui n'existe pas
Par:
mov al,[si]
mov var1, al

Car tu dois obligatoirement passer par un registre

Core Breaker :)
0
Rejoignez-nous