IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

x86 16-bits Assembleur Discussion :

[.COM] Réserver de la RAM fct 48h int 21h


Sujet :

x86 16-bits Assembleur

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 7
    Points : 7
    Points
    7
    Par défaut [.COM] Réserver de la RAM fct 48h int 21h
    Bonjour a toutes et tous

    dans un .COM je voudrais reserver de la Ram pour un tampon(afin de stocker une image par exemple) en utilisant la fct 48h int 21h
    cependant ma fonction renvoi dans ax 08h ce qui me parait bizzard pour une adresse (jutilise NASM)

    en compulsant la doc sur les int (biblePc.hlp) je trouve ceci:
    Entrée :

    AH = 48h
    BX = Nombre de paragraphes réservés

    Sortie :

    Flag Carry =0 : Tout va bien, dans ce cas
    AX = Adresse de segment de la zone de mémoire
    Flag Carry =1 : Erreur, dans ce cas
    AX = Code d'erreur
    7 : Bloc de contrôle de la mémoire détruit
    8 : Mémoire résiduelle insuffisante
    BX = Nombre de paragraphes encore disponibles

    Remarques :

    · Un paragraphe comporte 16 octets.
    · Si la mémoire demandée a pu être réservée, elle commence à l'adresse AX:0000.
    · Dans un programme COM, l'appel de cette fonction échouera systématiquement puisque la totalité de la place mémoire disponible est toujours affectée à un programme COM lors de son lancement.
    · Le contenu des registres CX, DX, SI, DI, BP, CS, DS, SS et ES n'est pas modifié par cette fonction.


    ce qui m indique a koi correspond 08h! mais me plonge dans la perplexité,
    que faire pour avoir assez de memoire ? ai je des prg resident qui me bouffe tout?

    cette doc indique que la fonction echouera systematiquemnt pour un .COM!??????? un ;COM utilise 64ko mais le reste de memoire conventionnelle comment y acceder si ce n est pas avec cette fonction?

    en outre en regardant le code source d un .COM ecrit pour TASM je trouve bien cette fonction d allocation (et en plus exactemnt comme j aimerai l utiliser)
    j adapte le code pour NASM et patatas bravas niet!!! toujours 08h dans ax!!?????????????????

    mes problemes sont donc:

    1. a quoi sert la fct 48h si comme le dit cette doc un .COM ne peut l utiliser

    2.si on peut l utiliser pour un .COM comment faire pour resoudre le probleme de memoire residuelle?

    3. sinon comment stocker en de ca des 64ko de notre .com
    (j ai trouve du code source verifiant la memoire basse et un code stockant des images sans utiliser cette fonction mais sous nasm ca marche pas)

    merci de votre attention
    bon code
    bul.

    (ps: desole d etre aussi long et explicatif)

  2. #2
    Candidat au Club
    Inscrit en
    Octobre 2002
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 3
    Points : 3
    Points
    3
    Par défaut impossible de réserver mémoir avec .com
    Il est impossible de réserver de la mémoire avec un .COM car le DOS réserve la totalité de la mémoire libre pour le chargement et l'exécution de ce type de programme donc quand tu demande de la mémoire, il n'y en a plus...

    Donc en fait tu peux te dire que tt ce qui est en mémoire au dessus de ton programme (des 64Ko) est disponnible pour toi puisque réservé par le DOS.

    Yann.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    humm geniale donc le 08h est normal!!et cette fonction sert pas pour les .com!!!

    pourtant j ai trouve du code (prg .com) qui l utilisait?? c est bizzard non?
    (a moins que j ai mal compris le code)

    en tout cas merci a toi...ca me ramene a d autre probleme mais au moins je ne cherche plus dans une movaise direction!
    bul.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 59
    Points : 88
    Points
    88
    Par défaut
    En fait si, un programme COM peut allouer dynamiquement la mémoire.
    Il est vrai qu'un programme COM se voit réserver toute la mémoire car le DOS 1, comme CP/M, ne peut pas lancer deux processus imbriqués. Or, DOS 2 permet au programme de réduire la taille du bloc alloué lors de son chargement. L'intérêt de cette libération de mémoire et de pouvoir lancer un programme fils.

    Ensuite, rien n'empêche d'allouer des blocs supplémentaires via la fonction 48h au fur à mesure des besoins (et éventuellement les libérer à l'aide de la fonction 49h) :
    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    ; Exemple d'allocation dynamique de mémoire par un programme au format COM.
    ;       MASM    EX_ALLOC;
    ;       LINK    EX_ALLOC;
    ;       EXE2BIN EX_ALLOC
     
     
    ; Taille à réserver en paragraphes.
    TailleMem       EQU     (TaillePrgm + Pile + 15) / 16
     
    CODE    SEGMENT
     
            ASSUME  CS:CODE,DS:CODE
            ORG     100h
     
    PRINC   PROC
            MOV     AH,30h
            INT     21h
            OR      AL,AL
            JE      DOS1
     
            MOV     SP,TaillePrgm + Pile    ; Base de la pile
            XOR     AX,AX                   ; Dépose un mot nul sur la pile
            PUSH    AX                      ; pour imiter le DOS
            MOV     AH,4Ah                  ; Réduit le bloc alloué par DOS
            MOV     BX,TailleMem            ; BX : nb de § à conserver depuis ES
            INT     21h
            CALL    ALLOC
            JMP     SHORT Fin
    DOS1:
            MOV     AH,9                    ; Affiche message
            MOV     DX,offset DOSancien
            INT     21h
    Fin:
            RET                             ; 1er mot de la pile nul donc INT 20h
    PRINC   ENDP
     
    ALLOC   PROC
            MOV     BX,10h                  ; 16 § à allouer
            MOV     AH,48h                  ; Alloue un bloc de mémoire
            INT     21h
            JC      Echec_alloc
            MOV     DS:Alloc_seg,AX         ; AX : segment du bloc alloué
            MOV     DX,offset AllocOUI
            JMP     SHORT Msg_alloc
    Echec_alloc:
            MOV     DX,offset AllocNON
    Msg_alloc:
            MOV     AH,9                    ; Affiche message
            INT     21h
            RET
    ALLOC   ENDP
     
    ; Messages ------------------------------------------------------------------
    DOSancien       DB      13,10
                    DB      'Ce programme requiert DOS 2 au minimum.'
                    DB      13,10,'$'
     
    AllocOUI        DB      13,10
                    DB      'Allocation réussie.'
                    DB      13,10,'$'
     
    AllocNON        DB      13,10
                    DB      'Echec de l',39,'allocation.'
                    DB      13,10,'$'
    ; ---------------------------------------------------------------------------
     
    TaillePrgm      EQU     $-CODE
     
    CODE    ENDS
     
    DATA?   SEGMENT BYTE                    ; Rattaché au segment préc. par BYTE
     
    Alloc_seg       DW      1       DUP (?)
     
                    DB      0C0h    DUP (?) ; Pile de 192 octets
    Pile            EQU     $-DATA?
     
    DATA?   ENDS
     
            END     PRINC

  5. #5
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Hello,

    Je préfère utiliser la fonction 4Ah, qui permet de modifier le nombre de paragraphes alloués par le programme.
    (en fait cette fonction remplace la 48h et la 49h )

    Il faut juste préciser le segment que l'on souhaite modifier
    (en général DS ou CS) en le plaçant dans ES
    Et ne pas oublier de compter la taille de l'exécutable (en général 4096) dans
    l'allocation des paragraphes (souvent la pile se trouve en bout des 64K de CS)

    a+ François

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 59
    Points : 88
    Points
    88
    Par défaut
    Le fonction 4Ah permet de diminuer l'allocation initiale du programme au format COM en ayant, au préalable, fixer la nouvelle adresse et la taille de la pile.
    Si, par la suite, ce programme a besoin de plus de mémoire, il utilise la fonction 48h qui évite de redéfinir la pile car allouant un nouveau bloc.
    Après, effectivement, il peut allonger et raccourcir ce dernier à l'aide, une nouvelle fois, de la fonction 4Ah.

    Quant à un programme au format EXE, il est parfois intéressant que son segment de données soit le dernier pour pouvoir l'agrandir ou le diminuer aisément via cette même fonction. Il y a bien sûr d'autres manières de gérer l'allocation dynamique...

    Bonne journée à vous.

Discussions similaires

  1. Problème de segmentation (fonction 02h INT 21h)
    Par william17 dans le forum Assembleur
    Réponses: 2
    Dernier message: 21/12/2011, 10h59
  2. Utilisation de ancienne int 21h après l'avoir détournée
    Par glINSAT dans le forum x86 16-bits
    Réponses: 9
    Dernier message: 05/12/2010, 21h37
  3. Réponses: 4
    Dernier message: 25/11/2008, 18h03
  4. [NASM] Int 21h qui ne fonctionne pas sur mon mini OS
    Par andromeda dans le forum Assembleur
    Réponses: 4
    Dernier message: 07/04/2007, 18h03
  5. Int 21H AX=716Ch ne fait pas mon affaire !!
    Par TheBigMac dans le forum Assembleur
    Réponses: 4
    Dernier message: 10/09/2004, 20h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo