MaxSoldier
Messages postés289Date d'inscriptiondimanche 10 août 2003StatutMembreDernière intervention28 février 2009
-
19 févr. 2005 à 13:22
CoreBreaker
Messages postés540Date d'inscriptiondimanche 23 mars 2003StatutMembreDernière intervention 5 octobre 2007
-
5 mars 2005 à 11:58
Bonjours, je voudrais afficher un nombre mais j'ai toujours des erreur :
J'ai donc 2 questions :
Comment déclarer une variable qui contiendra des nombre ( integer ) (
j'ai essayé : var db 100 dup (?) - mais je suis pas sûr de ce que sa
fais XD )
Comment afficher ces nombre ( l'interruption 21h avec AH=09h ne fonctionne pas ... )
Il faut peut etre ajouté un '$' à la fi de ma chaine pour qu'elle soit destiné à l'affichage, mais comment ?
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 19 févr. 2005 à 18:54
Les nombres sont codé en binaire, tu veux les afficher en base 10, il
faut donc que tu fasses des divisions successives par 10 de ton nombre.
Pour la déclaration, il suffit de faire var dw ? par exemple.
CoreBreaker
Messages postés540Date d'inscriptiondimanche 23 mars 2003StatutMembreDernière intervention 5 octobre 20071 5 mars 2005 à 11:58
db 100 dup(?) ; réserve 100 octets non initialisés
dw 10 dup (1234h) ; réserve 10 word (donc 20 octets) avec pour chacun des word la valeur 1234h
donc en mémoire tu auras 3412341234123412341234123412341234123412
c'est 3412 et pas 1234 car en mémoire la position des octets est inversée
un entier doit être convertit en chaine de caractères pour pouvoir être affichée avec la fonction 9 de l'int 21h, chaine qui doit effectivement se terminer par le caractère '$'
data segment word
un_int_a_afficher dw 12345
chaine db 5 dup(' '), '$' ; 5 car valeur max pour un word est 65535 (5 char max)
data ends
pile segment word
dw 100h dup(?)
pile ends
code segment word public use16
assume cs:code,ds:data,es:data,ss:pile
debut:
mov ax, data
mov ds, ax
mov es, ax
mov di, offset chaine + 4 ; on se place juste avant le $
; pour placer les chiffres de droite à gauche
mov ax, word ptr [un_int_a_afficher] ; le dividende
mov bx, 10 ; le diviseur (base décimale)
mov cx, 5 ; 5 chiffres max
std ; commande à stosb de placer di sur le char suivant en le déplacant
; sur la gauche du précédent
boucle:
xor dx, dx ; le dividende est dx:ax, et comme on a pas besoin de dx,
; on met dx à zéro
div bx ; après la division ax=quotient et dx=reste
xchg ax, dx
add al, '0' ; on fait la conversion en caractère
stosb ; on place le caractère
xchg ax, dx
or ax, ax ; on teste si le quotient est nul, dans ce cas on sort de la boucle
loopne boucle
; maintenant on affiche le résultat
; on fait pointer ds:dx sur la chaine
mov dx, offset chaine
mov ah, 9
int 21h
; on termine le programme (fonction 4Ch) avec code retour 0
mov ax, 4C00h
int 21h
code ends