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 |
Partager