fix: correction de bogues dans la fonction MBCreate : le segment reservé n'etait pas correctement renvoyé si l'espace mémoire etait pile.

This commit is contained in:
Nicolas Hordé 2004-10-31 09:31:20 +00:00
parent f94e485267
commit 0af23ddb31
1 changed files with 246 additions and 10 deletions

View File

@ -59,6 +59,7 @@ tables dw MBinit ;Table qui contient les adresses de toutes les fonctions de VI
dw MBCreate dw MBCreate
dw MBresident dw MBresident
dw MBGet dw MBGet
dw MBFind
FirstMB dw 0 FirstMB dw 0
@ -93,12 +94,16 @@ notforfree:
;Libère le bloc de mémoire GS ;Libère le bloc de mémoire GS
MBFree: MBFree:
push bx es push bx es
pushad
mov dx,gs
mov cx,16
mov ah,0ah
int 47h
popad
mov bx,gs mov bx,gs
dec bx dec bx
dec bx dec bx
mov es,bx mov es,bx
cmp es:[MB.Check],'NH'
je wasfree
cmp es:[MB.Reference],Free cmp es:[MB.Reference],Free
je wasfree je wasfree
cmp es:[MB.IsResident],true cmp es:[MB.IsResident],true
@ -145,6 +150,235 @@ foundmcb:
pop dx bx pop dx bx
ret ret
;==============================Affiche le nombre nb hexa en EDX de taille CX et couleur BL==============
ShowHex:
push ax bx cx edx si di
mov di,cx
sub cx,32
neg cx
shl edx,cl
shr di,2
mov ah,09h
and bx,1111b
Hexaize:
rol edx,4
mov si,dx
and si,1111b
mov al,cs:[si+offset tab]
push cx
mov cx,1
cmp al,32
jb control2
mov ah,09h
int 10h
control2:
mov ah,0Eh
int 10h
pop cx
dec di
jnz Hexaize
pop di si edx cx bx ax
ret
Tab db '0123456789ABCDEF'
;==============================Affiche une chaine DS:SI de couleur BL==============
showstr:
push ax bx cx si
mov cx,1
again:
lodsb
or al,al
jz fin
and bx,0111b
cmp al,32
jb control
mov ah,09h
int 10h
control:
mov ah,0Eh
int 10h
jmp again
fin:
pop si cx bx ax
ret
;================================================
;Routine de débogage
;================================================
regdata:
eaxr dd 0
ebxr dd 0
ecxr dd 0
edxr dd 0
esir dd 0
edir dd 0
espr dd 0
ebpr dd 0
csr dw 0
dsr dw 0
esr dw 0
fsr dw 0
gsr dw 0
ssr dw 0
reg db 0Dh,0Ah,"eax : ",0
db 0Dh,0Ah,"ebx : ",0
db 0Dh,0Ah,"ecx : ",0
db 0Dh,0Ah,"edx : ",0
db 0Dh,0Ah,"esi : ",0
db 0Dh,0Ah,"edi : ",0
db 0Dh,0Ah,"esp : ",0
db 0Dh,0Ah,"ebp : ",0
db 0Dh,0Ah,"cs : ",0
db 0Dh,0Ah,"ds : ",0
db 0Dh,0Ah,"es : ",0
db 0Dh,0Ah,"fs : ",0
db 0Dh,0Ah,"gs : ",0
db 0Dh,0Ah,"ss : ",0
showreg:
pushad
pushf
push ds
mov cs:[eaxr],eax
mov cs:[ebxr],ebx
mov cs:[ecxr],ecx
mov cs:[edxr],edx
mov cs:[esir],esi
mov cs:[edir],edi
mov cs:[espr],esp
mov cs:[ebpr],ebp
mov cs:[csr],cs
mov cs:[dsr],ds
mov cs:[esr],es
mov cs:[fsr],fs
mov cs:[gsr],gs
mov cs:[ssr],ss
push cs
pop ds
mov si,offset poppp
call Showstr
mov si,offset reg
mov di,offset regdata
mov bx,7
showregs:
cmp byte ptr cs:[si+6],":"
jne endshowregs
call Showstr
cmp byte ptr cs:[si+4]," "
je segsss
mov edx,cs:[di]
mov cx,32
call Showhex
add di,4
jmp showmax
segsss:
mov dx,cs:[di]
mov cx,16
call Showhex
add di,2
showmax:
add si,9
mov bp,dx
push si
mov si,offset beginds
call showstr
mov si,bp
mov cx,8
mov al,0
letshow:
mov dl,ds:[si]
inc si
call showhex
inc al
cmp al,10
jb letshow
mov si,offset ende
call showstr
mov si,offset begines
call showstr
mov si,bp
mov cx,8
mov al,0
letshow2:
mov dl,es:[si]
inc si
call showhex
inc al
cmp al,10
jb letshow2
mov si,offset ende
call showstr
pop si
jmp showregs
endshowregs:
mov si,offset poppp
call Showstr
xor ax,ax
int 16h
pop ds
popf
popad
ret
begines db ' es[',0
beginds db ' ds[',0
ende db '] ',0
poppp db '*********',0
;Renvoie en GS le MCB qui correspond a ds:si
MBFind:
push ax bx si di
mov bx,cs:firstmb
dec bx
dec bx
mov di,MB.Names
search:
mov gs,bx
cmp gs:[MB.Check],'NH'
jne itsend2
inc bx
inc bx
add bx,gs:[MB.Sizes]
cmp word ptr gs:[MB.Sizes],0
je itsend2
push si di
cmpnames:
mov al,gs:[di]
cmp al,ds:[si]
jne ok
cmp al,0
je ok
inc si
inc di
jmp cmpnames
ok:
pop di si
je foundmcb2
cmp gs:[MB.IsNotLast],true
je search
itsend2:
stc
pop di si bx ax
ret
foundmcb2:
clc
pop di si bx ax
ret
;Creér un bloc de nom ds:si de taille cx (octets) -> n°segment dans GS ;Creér un bloc de nom ds:si de taille cx (octets) -> n°segment dans GS
MBCreate: MBCreate:
@ -172,7 +406,6 @@ searchfree:
mov es:[MB.IsNotLast],True mov es:[MB.IsNotLast],True
mov es:[MB.Reference],cs mov es:[MB.Reference],cs
mov es:[MB.IsResident],False mov es:[MB.IsResident],False
mov es:[MB.Sizes],cx
mov di,MB.Names mov di,MB.Names
push ax cx push ax cx
mov cx,32 mov cx,32
@ -191,15 +424,17 @@ endofloops:
mov al,0 mov al,0
rep stosb rep stosb
pop cx ax pop cx ax
sub ax,cx inc bx
inc bx
sub ax,cx
dec ax dec ax
dec ax dec ax
;js nofree cmp ax,0
inc bx js nofree
inc bx je nofree
mov gs,bx mov es:[MB.Sizes],cx
add bx,cx add cx,bx
mov es,bx mov es,cx
mov es:[MB.IsNotLast],dl mov es:[MB.IsNotLast],dl
mov es:[MB.IsResident],False mov es:[MB.IsResident],False
mov es:[MB.Reference],Free mov es:[MB.Reference],Free
@ -208,6 +443,7 @@ endofloops:
mov dword ptr es:[MB.Names+4],0 mov dword ptr es:[MB.Names+4],0
mov es:[MB.Check],'NH' mov es:[MB.Check],'NH'
nofree: nofree:
mov gs,bx
clc clc
pop es di si dx cx bx ax pop es di si dx cx bx ax
ret ret