Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #41
    Membre habitué
    salut,
    j'ai un probléme avec ce code au niveau de la partie du test mémoire : http://esauvage.developpez.com/tutor...=page_3#LIII.4

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      test_memoire:
    				and ax, 0b1100
    				shr ax, 2
    				inc ax; une zone mémoire est donnée gratis.
    				shl ax, 4; les zones mémoires sont comptées par paquets de 16 ko
                                   call nombre_vers_chaine


    normalement a cette étape, dans un ax on a un nombre binaire

    comment alors on fait des devisions par 10 avant de convertir le contenu de Ax en décimal

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    nombre_vers_chaine:
    				push bx
    				push cx
    				push dx
    				mov bl, 10
    				mov cx, 1
    				xor dh, dh
    				stocke_digit:
    				div bl
    				mov dl, ah

  2. #42
    Membre averti
    Bonjour,

    Je ne saisis pas bien la question. On ne manipule que des nombres binaires. On ne les convertit en décimal que pour l'affichage, dans "nombre_vers_chaine" justement citée, et précisément par le "div bl" mis en gras.
    Pourriez-vous essayer de reformuler votre problème ?

  3. #43
    Membre habitué
    Citation Envoyé par Chevalier au taureau Voir le message
    Bonjour,

    Je ne saisis pas bien la question. On ne manipule que des nombres binaires. On ne les convertit en décimal que pour l'affichage
    je trouve pas le code qui permet de convertir un nombre binaire en décimal
    merci

  4. #44
    Membre averti
    Et bien dans ce cas, il n'y en a pas. Tous les nombres sont représentés en binaire.
    Par contre, la procédure d'affichage nombre_vers_chaine est, essentiellement, la conversion d'un nombre binaire en décimal.

  5. #45
    Expert éminent
    Citation Envoyé par je viens du sud Voir le message
    je trouve pas le code qui permet de convertir un nombre binaire en décimal
    merci
    Il faudrait revoir certaine base , je pense

  6. #46
    Membre habitué
    Citation Envoyé par Chevalier au taureau Voir le message
    la procédure d'affichage nombre_vers_chaine est, essentiellement, la conversion d'un nombre binaire en décimal.
    peut être qu'une chose m’échappe, pour cela je vais débuger avec vous ce code:


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
                                    test_memoire:
    				and ax, 0b1100   
    				shr ax, 2


    ici le registre ax contient le 3 éme et le 4 éme bit seulement . ces bits donnent des informations sur la capacité de la mémoire :

    00b => 16 Ko
    01b => 32 Ko
    10b => 48 Ko
    11b => 64 Ko

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    				inc ax; une zone mémoire est donnée gratis.
    				shl ax, 4; les zones mémoires sont comptées par paquets de 16 ko


    ici le nombre binaire qui représente le 3éme et le 4éme bit est multiplié par 16 tout en restant nombre binaire
    à la fin de ces instructions, AX contient la taille de la mémoire toujour en binaire, il faut alors convertir ce nombre en décimal , puis en chaîne pour pouvoir lui concaténer la chaîne ko (d’après ce que j'ai compris)
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    				mov si, hello
    				call nombre_vers_chaine
                                    ...
    nombre_vers_chaine:
    				...
    				mov bl, 10
    				mov cx, 1
    				xor dh, dh
    				stocke_digit:
    				div bl
    				mov dl, ah
    				push dx ;sauve le reste dans la pile


    DIV divise AX par 10, et stocke le reste dans AH puis on met ce reste dans dl
    normalement a cette étape, AX contient un entier binaire qui représente la taille de la mémoire, alors pourquoi le diviser par 10 ?
    normalement pour faire la conversion d'un binaire en décimale, en utilise l'algorithme des exposants.

  7. #47
    Membre habitué
    salut, je continu avec ton tutoriel et j'arrive au code de la page 4 : http://esauvage.developpez.com/tutor...e=page_4#LIV.6

    le code est donné ici : http://esauvage.developpez.com/tutor...bistouille.asm

    quand j'essaye de l'exécuter j'obtiens le résultat suivant sans avoir des graphiques mentionné dans l'article
    , même chose concernant le code Vesa de partie http://esauvage.developpez.com/tutor...ge=page_5#LV.4

    ça ne donne rien comme graphique à part du texte concernant les information du disque dur :

    figure montrant le résultat d'exécution des deux codes :





    P.S : mon systéme est windows 10 et j'utilise DOSbox 0.74
    core i5

    pour le code, j'ai changé 0b0001 en 0001b pour que ça a fonctionner

  8. #48
    Membre habitué
    salut,
    quelqu’un a vu l'auteur de cet article ?

  9. #49
    Responsable Pascal, Lazarus et Assembleur

    Bonjour,

    En fait, DosBox n'émule pas un BIOS complet, il y a peu de chances que tu arrives à obtenir les résultats espérés. Pense peut-être à une machine virtuelle complète ?
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]

  10. #50
    En attente de confirmation mail
    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

  11. #51
    Membre régulier
    je cmp
    Il me semble que tu n'as pas expliqué ces instructions.

  12. #52
    Membre averti
    JE : Jump if Equal, saute à l'adresse en paramètre si ZF est levé. on l'utilise souvent après une instruction CMP.
    CMP pour CoMPare, fait la différence entre ses deux arguments et lève des drapeaux selon les résultats de cette différence.

    @je viens du sud : un nombre est un nombre, il est le même quelque soit le système d'écriture utilisé. Comme système d'écriture, on utilise parfois le binaire, parfois l'hexadécimal, parfois le décimal. Mais le nombre reste le même. Ce n'est que la façon de l'écrire qui change. Ainsi, ax contient le nombre de pages de 16 ko. On multiplie donc ce nombre par 16 pour avoir le nombre de ko disponibles, selon la formule : nombre de pages x taille de la page = espace disponible.

    Pour VESA, le code s'étant arrêté sans afficher d'autres choses, c'est que VESA n'est pas supporté par DOSBox:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
        cmp al, 0x4F ; Si AL <> 0x4F, on n'a pas de VESA, donc fin.
        jne fin

  13. #53
    Invité
    Invité(e)
    Affichage décimal d'un nombre
    Citation Envoyé par je viens du sud Voir le message
    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 :Sélectionner tout -Visualiser dans une fenêtre à part
    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.

  14. #54
    Candidat au Club
    Citation Envoyé par Chevalier au taureau Voir le message
    Arf. Je dois préciser : effectuer un "cls" avant de lancer le programme. CLS pour CLear Screen, nettoyer l'écran. Le code, simpliste, ne gère pas le dépassement de l'écran. CLS vous remet en haut de l'écran.

    Je mets à jour dès que possible.
    Bonjour,

    Un double merci, déjà pour ce cours, c'est bien expliqué et c'est plaisant à lire, pour faire ses premiers pas dans le domaine c'est vraiment sympa !
    Et le deuxième pour cette solution, j'étais bloqué moi aussi lors de la saisie clavier, la solution était finalement toute simple. Je vais pouvoir continuer.

###raw>template_hook.ano_emploi###