Petite documentation (qui m'a vraiment aidé)
Je vous mets un lien de documentation pour les interruptions MS-DOS qui m'a vraiment aidé car je l'ai lue en parallèle du tutoriel :
https://www.gladir.com/LEXIQUE/INTR/
Sur ce, passez une bonne journée :)
Affichage décimal d'un nombre
Citation:
Envoyé par
je viens du sud
je trouve pas le code qui permet de convertir un nombre binaire en décimal
merci
Je crois comprendre. C'est un problème assez classique qui se traite toujours avec la même astuce. Tu as une valeur binaire et tu veux l'afficher à l'écran le plus normalement du monde, c'est-à-dire au format décimal. Evidemment, il te faut procéder à des divisions successives par 10 puis un stockage provisoire des différents restes en pile qui te permet de les ressortir ensuite dans le bon ordre pour l'affichage à l'écran. C'est le module ConvertAscii décrit ci-dessous.
Evidemment, il te faut un buffer de stockage pour ces chiffres que tu pourras ensuite lire d'un coup avec la fonction AH=9 de l'INT 21h. Dans cette fonction, DX contient l'offset du Buffer et la chaîne à afficher se termine obligatoirement par le caractère "$"
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| .DATA
Buffer db 16 dup(0)
.CODE
Start:
; AX contient le nombre binaire à afficher
mov di, offset Buffer
call ConvertAscii
;------- Affichage de la valeur décimale ----
mov ah,9
mov dx, offset Buffer
INT 21h
;-------- Fin et Sortie ------
mov ax,4C00h
INT 21h
;================================================================================
; Conversion valeur binaire format Word en chaîne ASCII dans le Buffer
;--------------------------------------------------------------------------------
; A l'entrée : AX contient la valeur à convertir en décimal
; EDI pointe le buffer recevant les chiffres décimaux
ConvertAscii:
push ebx
push ecx
push edx
mov bx,10
xor cx,cx
;--- Divisions par 10 successives pour obtenir un résultat affichable
mov dx,ax
xor ax, ax ; AX = 0
mov ax,dx
BcleAscii:
xor dx,dx ; dx = 0 (car c'est la partie haute du dividende)
div bx ; division par 10 de DX:AX
push dx ; on stocke le reste en pile
inc cx ; on compte le nombre d'empilages
cmp ax,0 ; si le quotient est nul, on arrête
jne BcleAscii
;--- Restitution de la pile dans le buffer
BcleBuffer:
pop ax
add al,30h ; conversion en ASCII
stosb
loop BcleBuffer
mov al,'$' ; marqueur fin de chaine
stosb
pop dx
pop cx
pop bx
ret |
Je ne pratique plus le DOS depuis belle lurette et j'ai donc fait ça de mémoire en adaptant un morceau de programme 32 bits. Tout ça pour dire qu'une erreur de ma part n'est pas à exclure, notamment dans l'utilisation de l'INT21h et la structure (inachevée) du programme. N'hésite pas à me demander s'il y a quelque chose qui te chiffonne.