70 lines
2.0 KiB
NASM
70 lines
2.0 KiB
NASM
.386P
|
|
.MODEL SMALL, SYSCALL
|
|
|
|
.CODE
|
|
|
|
public NoLanguage Expand
|
|
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
Expand PROC USES ESI EDI EBX EBP,\
|
|
src:DWORD, dest:DWORD, count:DWORD ; COUNT devrait etre un DWORD !!!
|
|
|
|
mov esi, src
|
|
mov edi, dest
|
|
mov ebp, count ; compteur pour savoir si on a fini...
|
|
; et puis j'ai plus besoin de lire
|
|
; d'autre parametres... d'ou BP !
|
|
; BP = decomp size
|
|
boucle:
|
|
mov dx, 8 ; 1 octet info pour 8 data de 8 ou
|
|
; 16 bits (ca depend du bit...)
|
|
lodsb
|
|
mov bx, ax ; octet d'info dans bl
|
|
next:
|
|
shr bx, 1 ; ca va plus vite de décaler bx ou
|
|
; bl ? (Vrai question, chef)
|
|
jnc copie ; chaque bit indique la nature de
|
|
; ce qui suit
|
|
|
|
movsb ; ici un octet de data a recopier
|
|
dec ebp ; 1 de moins
|
|
jz termine ; si c'est fini, c'est fini
|
|
dec dx ; 1 bit de moins
|
|
jnz next ; s'il en reste on continu
|
|
jmp boucle ; sinon on lit un octet d'info de plus
|
|
|
|
copie: ; ici on a 16 bits formant un offset
|
|
; (sur 12 bits) et une longueur ; (sur 4 bits)
|
|
lodsw ; on lit donc cette donnee
|
|
movzx ecx, ax
|
|
mov eax, ecx
|
|
and ecx, 0Fh ; on recupere la longueur dans cx
|
|
inc ecx ; on ajuste car pas de copie de
|
|
inc ecx ; bloc de longeur < 2 (d'ou gain...)
|
|
sub ebp, ecx ; il restera ca en moins a faire
|
|
shr eax, 4 ;
|
|
; on recupere l'offset
|
|
not eax ; en fait c'est un decalage en
|
|
; arrière - 1 (not ax = -ax - 1)
|
|
add eax, edi ; par rapport à di (ax = di - ax - 1)
|
|
xchg eax, esi ; on sauve si tout en lui donnant
|
|
; l'ofset calcule
|
|
rep movsb ; on fait la recopie
|
|
|
|
mov esi, eax ; restore si
|
|
or ebp, ebp ; il en reste ?
|
|
jz termine ; ...
|
|
dec dx ; il reste des bits d'info ?
|
|
jnz next ; ...
|
|
jmp boucle ; ...
|
|
termine: ; c'est fini... Quoi ?!!! deja ?!!!
|
|
; c'est con cette methode de
|
|
; compression ! Mais ca marche !
|
|
ret
|
|
|
|
Expand ENDP
|
|
|
|
|
|
end
|