Donc je fais ma division puis j'ai le resultat dans ah
xor dx,dx
xor ax,ax
mov al,acSasi4
add al,acSasi5
mov dl,40
div dl
xor cx,cx
mov cl,100
mul cl
; resultat dans ah
; mas comment mettre
; le resultat dans une variable
; ici cette variable est bavr1
; initialisé commé ca: bvar1 db ?
; mettez un exemple si possible...en plus de l'explication :-)
mov ah,02h ;
mov dh,20 ; Place le
mov dl,18 ; curseur
int 10h ;
lea dx,bvar1 ;
mov ah,09h ; affiche resultat moyenne
int 21h ;
Merci d'avance
MOV bvar1, AX ne marche pas ?
sinon au pire LEA DX, bvar1 pour mettre dans DX l'adresse de la variable bvar1
et mov [DX],AX pour mettre à l'adresse contenu dans DX la valeur AX
Non ca ne marche pas... :-(
et "LEA DX, bvar1
et mov [DX],AX"
quand je met ca, ca me met: error A2048 must be index or base register
...
et MOV [bvar1], AH ?
EDIT: sinon fait voir ton code pour voir où tu as déclaré ta variable.
REDIT: en plus j'avais mis AX, alors que c'est AH (puisque AX est sur 16 bits)
.model small
.stack
.data
acMsg1 db "Matricule: $"
acSasi1 db 5,?,"$$$$"
acMsg2 db "Nom: $"
acSasi2 db 22,0,20 dup(" " )
acMsg3 db "Prenom: $"
acSasi3 db 22,0,20 dup(" " )
acMsg4 db "Cote 1: /20$"
acSasi4 db ?
acMsg5 db "Cote 2: /20$"
acSasi5 db ?
bvar1 db "$$$$0"
acMoy db "Moyenne: %$"
fini db "ESC pour quitter, ENTER pour continuer$"
.code
debut:
mov ax,@data
mov ds,ax
mov ah,0fh ;
int 10h ; efface
mov ah,00h ; l'ecran
int 10h ;
mov ah,02h
mov dh,5
mov dl,30
int 10h
lea dx,acMsg1 ;
mov ah,09h ; affiche Msg1
int 21h ;
mov ah,02h
mov dh,10
mov dl,13
int 10h
lea dx,acMsg2 ;
mov ah,09h ; affiche Msg2
int 21h ;
mov ah,02h
mov dh,12
mov dl,10
int 10h
lea dx,acMsg3 ;
mov ah,09h ; affiche Msg3
int 21h ;
mov ah,02h
mov dh,14
mov dl,10
int 10h
lea dx,acMsg4 ;
mov ah,09h ; affiche Msg4
int 21h ;
mov ah,02h
mov dh,16
mov dl,10
int 10h
lea dx,acMsg5 ;
mov ah,09h ; affiche Msg5
int 21h ;
mov ah,02h
mov dh,20
mov dl,9
int 10h
lea dx,acMoy ;
mov ah,09h ; affiche Moy
int 21h ;
mov ah,02h
mov dh,24
mov dl,1
int 10h
lea dx,fini ;
mov ah,09h ; Msg pour fin
int 21h ;
;**************************************************
mov ah,02h
mov dh,5
mov dl,41
int 10h
lea dx,acSasi1 ;
mov ah,0ah ; affiche sasie1 entrer
int 21h ;
mov ah,02h
mov dh,10
mov dl,18
int 10h
lea dx,acSasi2 ;
mov ah,0ah ; affiche sasie2 entrer
int 21h ;
mov ah,02h
mov dh,12
mov dl,18
int 10h
lea dx,acSasi3 ;
mov ah,0ah ; affiche sasie3 entrer
int 21h ;
mov ah,02h
mov dh,14
mov dl,18
int 10h
xor si,si
chiffre1:
mov ah,01h
int 21h
cmp al,0dh ;'13'
je chiffre2
cmp si,4
je chiffre2
and al,0fh ;recupere le nombre
mov acSasi4[si],al
inc si
jmp chiffre1
chiffre2:
xor si,si
chiffre2a:
cmp si,0
jne chiffre2b
mov ah,02h
mov dh,16
mov dl,18
int 10h
xor si,si
chiffre2b:
mov ah,01h
int 21h
cmp al,0dh ;'13'
je calcul
cmp si,4
je calcul
and al,0fh ;recupere le nombre
mov acSasi5[si],al
inc si
jmp chiffre2a
;**************************************************
;Calcul
;******
calcul:
xor dx,dx
xor ax,ax
mov al,acSasi4
add al,acSasi5
mov dl,40
div dl
xor cx,cx
mov cl,100
mul cl
mov [bvar1],ah
;**************************************************
mov ah,02h
mov dh,20
mov dl,18
int 10h
lea dx,bvar1 ;
mov ah,09h ; affiche resultat moyenne
int 21h ;
mov ah,02h
mov dh,24
mov dl,39
int 10h
boucle:
mov ah,01h
int 21h
cmp al,0dh
jne suite ; pour remonter + que 128 char
jmp debut ;
suite:
cmp al,1bh
je fin
jne boucle
;**************************************************
fin:
mov ah,0fh ;
int 10h ; efface
mov ah,00h ; l'ecran
int 10h ;
mov ah,4ch
int 21h
end
Voila mon programme :-P donc si tu pouvais m'aider...Merci
le registre DS pointe bien sur la section data.
Donc ça c'est bon.
Je vois que ta variable est un tableau, donc tu dois probablement pouvair faire comme pour les autres variable en faisant:
XOR SI,SI
MOV bvar1[SI], AH
ou directement MOV bvar1[0], AH
entouré de PUSH SI et POP SI si tu veux garder le contenu de SI.
ça devrait marcher ça non ?
J'ai pas testé ton code, j'ai plus de compilateur ASM installé :-D
Je testerais bien en DEBUG mais comme il n'y a pas de variable... ;-)
Ben rien ne marche lol :-D
Mais bon...Merci quand meme
Ben je sais pas lol
Peut-être que quelqu'un donnera la solution.
Si tu la trouve, poste là ;-)
salut,
bon ça fait longtemps que je n'ai pas fais d'assembleur mais je me pose une petite question.
Si je comprends bien tu lis caractères par caractères et tu mets ce que tu lis dans les 2 variables (de type caractère) acSasi4 et acSasi5 jusqu'à que tu passes à la ligne avec la touche entrée (caractère 0dh).
Ce qui me dérange, mais je peux me tromper c'est ce qui suit :
mov al,acSasi4
add al,acSasi5
car acSasi4 et acSasi5 sont de type db et non dw. Donc je ne vois pas trop ce que tu additionnes là.
A mon avis, il faut que
- tu déclares acSasi4 et acSasi5 en tant que dw.
- tu lises les deux valeurs dans une chaine et que après, par récursivité tu transformes ces chaînes en chiffre. ( acSasi4+=(caractere i transforme en décimal)*10^(nbr de chiffre - position i) ... en gros
- tu fasses la moyenne
- tu retransformes ton chiffre en chaine de caractères.
Enfin ça fait longtemps ... alors je peux me tromper ;-)
AL c'est la partie basse de AX (16 bits), donc AL est bien sur 8bits, c'est bien un byte ;-)
S'il déclarait en word (dw), il devrait mettre MOV AX, acSasi.
Après pour l'algo je sais pas, j'ai pas cherché à comprendre.
Sinon je viens de penser à un truc, peut être en utilisant le registre DI au lieu de DX pour l'offset:
LEA DX, bvar1
MOV DI, DX
MOV DS:[DI], AX
Si ça marche, tester sans le DS:, en mettant directement lea di, bvar1.
Désolé de ne pas avoir repondu plus tot mais je me suis concentré sur mes exams et je n'ai plus trop surfé ;-)
sinon merci beaucoup pour vos aides
j'ai avancé dans ce programme et maintenant il me reste deux problemes à résoudre
le permier:
j'ai déja rentré les deux valeur en décimale (j'ai regardé sous afd) et qd parexemple j'ai 12 dans ax (avec le calcule de moyenne) je fais sub ax,10 (donc 12-10) il me reste 8...et avec 14 il me reste A...Probleme 1 :-P
xor cx,cx
hexa:
cmp ax,10
jl suite_hexa
sub ax,10
inc cx
jmp hexa
suite_hexa:
mov bvar1,cx
add bvar1,30h
mov bvar2,ax
add bvar2,30h
ensuite qd j'affiche bvar1 et bavr2 il m'affiche les chiffres (encore pour l'exemple de 12) 18 donc ca ca ne me derange pas mais apres le 18 j'ai plein de caractere bizard
le code est:
mov ah,02h
mov dh,8
mov dl,0
int 10h
lea dx,bvar1
mov ah,09h
int 21h
mov ah,02h
mov dh,8
mov dl,1
int 10h
lea dx,bvar2
mov ah,09h
int 21h
merci d'avance pour vos réponses...
Déjà moi je mettrai tout en hexa (cmp ax, 0Ah), pour pas se mélanger. De toutes façon tout sera compilé en hexa.
Les nombres que tu donnes c'est en utilisant un debugger que tu les vois ? c'est-à-dire que tu vois dans AX 0Ch avec le sub et 0Ah après ?
S'il y a un problème pour la conversion, forcément, ça n'affiche pas ce qu'il faut après.
Non en fait dans le debugger AFD je vois 12 en décimale dans AX (car j'ai entré des chiffres un par un en faisant *10 + un masque pour avoir la valeur décimale).
Ensuite je fais SUB AX,10 (ou 0Ah) et au lieu d'avoir 2 dans AX j'ai 8 :-? et avec un autre valeur comme 14 j'ai 0Ah
Tu peux détaillé ton * 10 + masque ? Parceque je vois pas comment un peut utiliser un masque binaire pour des valeurs décimales.
Ok mais ça n'a rien avoir avec le probleme enfin je pense... :-)
-> voila le code:
mov dx,0 ;init resultat
Encore:
mov ah,1
int 21h ;j'entre 1 caractere
cmp al,0dh ;'13' -> enter
je fin
cmp al,30h
jl Encore ;pas un chiffre
cmp al,39h
jg Encore ;pas un chiffre
and al,0fh ;recupere le nombre
rol dx,1 ;
mov bx,dx ;
rol dx,1 ;
rol dx,1 ;
add dx,bx ;-->*10 pour passer aux dizaines
xor ah,ah ;ah=0
add dx,ax ;le nombre est dans dx
jmp Encore
En resumé j'entre 1 element au clavier je fais un masque pour recupérer le nombre en decimale puis je le multiplie par dix si j'en entre d'autre...
Je m'etais mal expliquer ;-)
ok tu fais x*8 + x*2
Pour le xor et le add, tuje pense que tu peux faire simplement ADD DL, AL
Sinon à voir le code (j'ai pas testé), ça me parait tout correct, comme le code précédent.
Entre cette fonction et ton sub, tu n'apellerais pas une fonction qui modifie le registre AX ?
voila ce que je fais pendant et apres l'encodage:
CALL encode
mov acSasi4,dx
mov ah,02h
mov dh,2
mov dl,0
int 10h
CALL encode
mov acSasi5,dx
mov ah,02h
mov dh,5
mov dl,0
int 10h
;**************************************************
; Calcul de la moyenne
; --------------------
xor ax,ax
xor bx,bx
mov ax,acSasi4
add ax,acSasi5
shr ax,1
;**************************************************
; Remet la valeur en hexa
; -----------------------
xor cx,cx
hexa:
cmp ax,10
jl suite_hexa
sub ax,10
inc cx
jmp hexa
suite_hexa:
mov bvar1,cx
add bvar1,30h
mov bvar2,ax
add bvar2,30h
;**************************************************
mov ah,02h
mov dh,8
mov dl,0
int 10h
lea dx,bvar1
mov ah,09h
int 21h
mov ah,02h
mov dh,8
mov dl,1
int 10h
lea dx,bvar2
mov ah,09h
int 21h
mon probleme avec le sub, peut-il venir de mon shr ax,1 ???
au fait puis-je afficher les variables bvar1 et 2 avec ah,09h en les initialisant comme ca ?
bvar1 dw ?
bvar2 dw ?
non le shr met bien un 0 devant, et s'il y avait un 1 derrière il mettrais le carry flag à 1.
Par contre ça me fait penser que tu utilises ROL pour faire le *10, qui lui reprend le carryflag pour le remettre de l'autre côté. Est-ce qu'il ne faudrait pas plutôt utiliser SHR ? parceque si un bit de poid fort se cache, au prochain ROL, ça ajoute 1.
Sinon, ben je vois pas, faudrait debugger pas à pas et vérifier à chaque instruction que les registres sont remplis comme prévus.
Il y a 1685 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.
