Déclarations des variables en ASM

Signaler
Messages postés
1
Date d'inscription
jeudi 11 décembre 2003
Statut
Membre
Dernière intervention
14 décembre 2003
-
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
-
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

Messages postés
36
Date d'inscription
dimanche 8 décembre 2002
Statut
Membre
Dernière intervention
8 avril 2005

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.
Messages postés
540
Date d'inscription
dimanche 23 mars 2003
Statut
Membre
Dernière intervention
5 octobre 2007
1
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 :)