Se connecter / S'enregistrer
Votre question

Probleme de division en assembleur

Tags :
  • Lea
  • Programmation
Dernière réponse : dans Programmation
5 Décembre 2005 03:09:30

Voila au niveau de mon entête "calcul" j'ai un "Dépassement de division"
Pourriez-vous m'expliquer pourquoi ???

*******************************************************************
.model small
.stack
.data
acSasi4 db 6,0,4 dup(" ")
acSasi5 db 6,0,4 dup(" ")
bvar1 db ?

.code
mov ax,@data
mov ds,ax

mov ah,0fh
int 10h
mov ah,00h
int 10h

lea dx,acSasi4
mov ah,0ah
int 21h

mov ah,02h
mov dh,2
mov dl,0
int 10h

lea dx,acSasi5
mov ah,0ah
int 21h

;Calcul
;*****

mov ax,0
mov al,acSasi4
add al,acSasi5
mov bx,2
div bx
mov bvar1,al

fin:
mov ah,4ch
int 21h
end

*******************************************************************

Et pourriez-vous aussi m'expliquer comment afficher le resultat de la division (ici "bvar1")

Merci d'avance...

Autres pages sur : probleme division assembleur

5 Décembre 2005 09:51:22

http://www.iprezo.org/index.php?page=ins

divise le contenu du couple de registre DX-AX par le contenu de l'opérande source et place le quotient dans AX et le reste dans DX

Il faut initialiser dx à zéro avant de diviser.

Pour l'affichage : call printf
5 Décembre 2005 13:11:14

Merci chrisz
Mais... :-o
Je suis débutant en assembleur donc pourrais-tu me mettre un exemple pour la division :-)
Et pour le call printf comment ca marche je n'ai jamais vu ca :-P (il n'y a pas d'autre moyen ??)

Merci d'avance...
Contenus similaires
a b L Programmation
5 Décembre 2005 13:14:48

Voilà tu utilises DX, alors il s'en sert pour faire la div.

Sinon, pour initialiser un registre à 0 tu peux faire XOR DX, DX (c'est peut être plus rapide qu'un MOV DX,0 je ne sais plus trop).
Pour l'affichage à l'écran, c'est la fonction 09h de l'interruption DOS 21h avec DS l'adresse de segment et DX l'offset de la chaine de caractère
MOV AH,09
LEA DX, ta_chaine_terminee_par_un_0
int 21h
5 Décembre 2005 14:12:07


Donc pour la division je fais comme ca ??

mov dx,0 ou xor dx,dx
mov ax,0
mov al,acSasi4
add al,acSasi5
mov dx,2
div dx
mov bvar1,al


Et pour l'affichage comme ca ( Quand je fais comme ca ca marche pas")

lea dx,bvar1
mov ah,09h
int 21h
5 Décembre 2005 16:44:49

C'est bon la division fonctionne il fallait que je divise avec un registre de 8bits (-->DL et non DX :bounce: )

pour l'affichage par contre j'ai toujours un probleme avec l'affichage il m'affiche un signe(un pique comme dans lesjeux de cartes :-P) donc comment faire pour afficher le resultat (??Faut-il recuperer le chiffre au moment de l'encodage??)

Merci d'avance et merci aussi pour vos explications plus haut :-D
a b L Programmation
5 Décembre 2005 19:06:01

Pour l'affichage c'est l'affichage d'une chaine de caractères, c'est-à-dire une suite de caractères codés en ASCII (www.asciitable.com).
Téminé par le caractère NUL 00h
Donc si tu veux afficher par exemple 25h, il te faut un tableau de caractères d'hexa:
32 35 00
car '0' = 30, '1' = 31 ...

Donc si tu veux absolument afficher ce nombre en assembleur (sans faire appel à printf), je te suggère de faire une fonction qui convertit une valeur 8 bits en 2 caractères hexadécimaux en utilisant 2 masques et un décalage de bits.

Comme tu utilises un registre 8bits (AL), tu peux prévoir un tableau de 3 octets pour mettre tes 2 caractères ASCII et ton 00 de fin.

C'est seulement après avoir fait ça que tu peux utiliser la fonction 09h int 21h
5 Décembre 2005 21:55:09

Ok...merci
Ben je vais tester tout ca :-)
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS