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 MBresident
dw MBGet
dw MBFind
FirstMB dw 0
@ -93,12 +94,16 @@ notforfree:
;Libère le bloc de mémoire GS
MBFree:
push bx es
pushad
mov dx,gs
mov cx,16
mov ah,0ah
int 47h
popad
mov bx,gs
dec bx
dec bx
mov es,bx
cmp es:[MB.Check],'NH'
je wasfree
cmp es:[MB.Reference],Free
je wasfree
cmp es:[MB.IsResident],true
@ -145,6 +150,235 @@ foundmcb:
pop dx bx
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
MBCreate:
@ -172,7 +406,6 @@ searchfree:
mov es:[MB.IsNotLast],True
mov es:[MB.Reference],cs
mov es:[MB.IsResident],False
mov es:[MB.Sizes],cx
mov di,MB.Names
push ax cx
mov cx,32
@ -191,15 +424,17 @@ endofloops:
mov al,0
rep stosb
pop cx ax
sub ax,cx
inc bx
inc bx
sub ax,cx
dec ax
dec ax
;js nofree
inc bx
inc bx
mov gs,bx
add bx,cx
mov es,bx
cmp ax,0
js nofree
je nofree
mov es:[MB.Sizes],cx
add cx,bx
mov es,cx
mov es:[MB.IsNotLast],dl
mov es:[MB.IsResident],False
mov es:[MB.Reference],Free
@ -208,6 +443,7 @@ endofloops:
mov dword ptr es:[MB.Names+4],0
mov es:[MB.Check],'NH'
nofree:
mov gs,bx
clc
pop es di si dx cx bx ax
ret