Автор Тема: Упаковка/Распаковка  (Прочитано 1824 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Silver-Queen

  • Коллежский регистратор
  • *
  • Сообщений: 8
  • Репутация: 0
  • Пол: Женский
Упаковка/Распаковка
« : јРЩ 12, 2009, 01:44:56 am »
У меня вопрос маленький, помогите пожалуйста!?
Программа по упаковке знаковых слов в байты или двойных слов в слова может упаковывать файлы?(картинки и т.п)

Оффлайн Veliant

  • Надворный советник
  • *****
  • Сообщений: 331
  • Репутация: 7
  • Пол: Мужской
Re: Упаковка/Распаковка
« Ответ #1 : јРЩ 12, 2009, 08:14:35 am »
Переделай так что бы программа считывала из файла слова/двойные слова паковала и писала в другой файл
Помощь в программировани и различные статьи
http://libcoder.blogspot.com/

Оффлайн Silver-Queen

  • Коллежский регистратор
  • *
  • Сообщений: 8
  • Репутация: 0
  • Пол: Женский
Re: Упаковка/Распаковка
« Ответ #2 : јРЩ 12, 2009, 11:18:11 am »
ну т.е можно=) спасибо!!!

Оффлайн Veliant

  • Надворный советник
  • *****
  • Сообщений: 331
  • Репутация: 7
  • Пол: Мужской
Re: Упаковка/Распаковка
« Ответ #3 : јРЩ 12, 2009, 11:21:00 am »
смотря каким алгоритмом.. может распаковать не реально будет
Помощь в программировани и различные статьи
http://libcoder.blogspot.com/

Оффлайн Silver-Queen

  • Коллежский регистратор
  • *
  • Сообщений: 8
  • Репутация: 0
  • Пол: Женский
Re: Упаковка/Распаковка
« Ответ #4 : јРЩ 12, 2009, 06:29:44 pm »
алгоритм у меня есть в книжке=) мне только разобраться как файл на слова делить(((

Оффлайн Silver-Queen

  • Коллежский регистратор
  • *
  • Сообщений: 8
  • Репутация: 0
  • Пол: Женский
Re: Упаковка/Распаковка
« Ответ #5 : јРЩ 30, 2009, 10:41:24 pm »
У меня есть две программы упаковка и распаковка, помогите мне пожалуйста её сделать в одну?

упаковка:
include userv.mac

data segment
file_name db 255 dup(?)
cash db 255 dup (?)
len db ?
handle dw ?
handle_cash dw ?
buff db ?
bytes db ?
bytes_ne db ?
sch db ?
dls db ?
data ends

code segment
assume cs:code, ds:data

start: mov ax,data            ;передаём координаты сегмента data
mov es,ax    ;в es (пара es:di)
mov cl,ds:80h              ;первый байт командной строки, указывающий на длину её самой,кладем в cl
cmp cl,0
je result
dec cl                    ;уменьшаем cl, чтобы получить длину строки без всякого мусора
push ds                    ;сохраняем ds командной строке
mov ax,data                ;кладем в ds data
mov ds,ax
mov len,cl                 ;теперь можно в память ложить, а то положили бы в память, совсем не относящуюся к нашей проге
pop ds                     ;достаем ds командной строки (напомню: пара ds:si)
mov dx,1                   ;будем использовать как флаг, в данном случае => что параметр был введен из командной
mov si,82h            ;первый байт параметра (почему мы пропустили 81h? потому что там пробел)
lea di,file_name    ;а di у нас показывает на имя файла, дабы потом записать параметр туда
param: cld
lodsb                      ;грузим байт из командной
cmp al,0dh                 ;сравним с кодом enter
je inp_over                ;закончим запись
stosb                      ;записываем символ в strok
jmp param                  ;возвращаемся обратно
result: mov dx,0                   ;будем использовать как флаг, в данном случае => что параметр не был введен из командной
inp_over: mov ax,data        ;а теперь координаты сегмента data передаем в ds
mov ds,ax                  ;ибо ds командной строки нам уже не нужен
cmp dx,0                   ;а проверим не был ли введен параметр из командной строки?
jne to_par                 ;был введен
                           ;а тут вводим, раз не был введен
inp_hand: mov  ax,0600H      ;>чистка экрана
  mov  bh,07                 ;ничто иное как прокрутка на страницу
        mov  cx,0000       ;если встеришь дальше такую же функцию, смотри сюда
        mov  dx,184FH      ;>
int  10H
mov  ah,02                 ;установка курсора   
        mov  bh,00     
        mov  dh,0          ;строки   
        mov  dl,0          ;столбцы, если встеришь дальше такую же функцию, смотри сюда   
        int  10H
        u_msg "‚ўҐ¤ЁвҐ Ё¬п д ©« : " ;собственно приглашение ввести параметр, которого не было в командной строке
lea dx,file_name           ;эта строка в которую будет введено наше имя файла в форматировании вида
mov bx,dx            ;в bx адрес strok
mov al,253                 ;количество символов в строке, не 255, т.к. первые два зарезервированны
mov cl,255            ;реальное кол-во символов
mov [bx],al                ;в первый байт кладем длину, учитывая резервацию
mov ah,0ah                 ;функция ввода строки
int 21h
mov dl,[bx]+1              ;в dl после этого кол-во введенных символов (второй байт)
mov len,dl                 ;запоминаем длину в памяти
sub cl,dl                  ;в cl разница между реальным числом символов и введенным
lea si,file_name           ;адрес строки в si для movsb
mov di,si                  ;и в di для movsb и stosb
add si,2                   ;увеличиваем т.к. первые два байта зарезервированны
mv_else:                    ;форматируем строку, убирая все лишнее
movsb                      ;копируем байты
dec dl                    ;уменьшаем dl, он у нас как счетчик
cmp dl,0                   ;сравниваем с 0
jne mv_else                ;если не равен то обратно
obnul: mov al,0                   ;если равен, то дописываем 0 в конец строки
stosb                      ;запись байта
dec cl                     ;аналогично cl счетчик
cmp cl,0
jne obnul
to_par: lea dx,file_name           ;адрес строки
par: mov ah,3dh            ;открыть файл
mov al,0
int 21h
jc not_ex                  ;если его не существует
mov handle,ax              ;сохраняем хэндл
archiving:lea si,file_name
lea di,cash
        mov bl,len
        mov al,len
        cbw                ;преобразовываем длину строки из байта в слово
        add si,ax          ;прибавляем к адресу строки
        push si            ;в стек адрес
dec_si: dec si                    ;уменьшаем адрес на 1
cld
        lodsb            ;грузим символ
        cmp al,'\'         ;сравниваем со слешем
        je name_formed     ;если равно, значит имя сформированно
        dec bl             ;уменьшаем счетчик
        dec si             ;уменьшаем адрес
        cmp bl,0           ;сравниваем счетчик с 0
        jne dec_si         ;если не равен, обратно
name_formed:pop bx            ;в стеке лежал адрес, ну теперь он там не лежит:) а лежит в bx
disp_it: cld
lodsb
cmp al,'.'
je disp_it
dec si
movsb
cmp si,bx                  ;не выведем все имя
je stp_name                ;если вывели то дальше
jmp disp_it                ;нет - продолжаем выводить
stp_name: mov al,'.'
stosb
mov al,'a'
stosb
mov al,'r'
stosb
mov al,'c'
stosb
mov al,'h'
stosb
call in_arch
mov ah,41h
lea dx,file_name
int 21h
jmp exit
not_ex: u_msg <13,10,"ЌҐв в Є®Ј® д ©« , ­ ¦¬ЁвҐ «оЎго Є« ўЁиг (esc - ўл室)"> ;если файла не существует
u_key_sym           ;просим ввести символ
cmp ax,283           ;сравниваем с esc
je exit                   ;да - выходим
jmp inp_hand
exit:
mov ah,4Ch
        int 21h
;процедура архивирования - сжатие методом кодирования серий (unbuffered RLE кодинг)
;-----------------------------------------------------------------------
in_arch proc
mov ah,3ch    ;создаем файл
mov cx,00
lea dx,cash;с именем cash
int 21h
mov handle_cash,ax
mov ah,3eh;закрываем
mov bx,handle_cash
int 21h
mov ax,3d02h;открываем в режиме записи
lea dx,cash
int 21h
mov handle_cash,ax
mov ah,3fh;функция чтения
mov al,0
mov bx,handle
lea dx,buff
mov cx,1;заносим один байт в buff
int 21h
cmp ax,0
jne ok
jmp exit
ok: mov al,buff
mov bytes,al
mov ah,40h;и пишем его
mov bx,handle_cash
mov cx,1
lea dx,bytes
int 21h
mov al,0
mov sch,al
mov dls,al
read_file:mov ah,3fh;функция чтения
mov al,0
mov bx,handle
lea dx,buff
mov cx,1;заносим один байт в buff
int 21h
cmp ax,0 ;проверяем не конец ли файла
jne next_read;если не конец
jmp cmp2end;если конец
next_read:mov al,buff;продолжаем действия
tsf: cmp al,bytes ;равен ли только что считанный байт с предыдущим
je inc_equs ;если равен то
mov bl,dls;если не равен то проверяем были ли повторяющиеся байты до этого
cmp bl,0
jne out_pb;если были то
mov cl,bytes
mov bytes_ne,cl
mov bytes,al;если не были, то в byte текущий байт
mov ah,40h;и пишем его
mov bx,handle_cash
mov cx,1
lea dx,bytes
int 21h
jmp read_file ;прыгаем обратно
out_pb: push ax
mov ah,40h ;выводим последний повторившийся байт
mov bx,handle_cash
mov cx,1
lea dx,bytes
int 21h
mov bl,sch
dec bl ;уменьшаем счетчик повторений на 1
mov sch,bl
mov ah,40h;выводим счетчик в кэш
mov bx,handle_cash
mov cx,1
lea dx,sch
int 21h
mov bl,0
mov sch,bl;обнуляем счетчик
mov dls,bl
pop ax
jmp tsf
inc_equs: mov bl,1
mov dls,bl
mov bl,sch
inc bl ;увеличиваем счетчик повторений
mov sch,bl
cmp bl,255
jne to_r_file1
jmp bxc
to_r_file1:jmp to_r_file
bxc: mov ah,40h ;выводим последний повторившийся байт
mov bx,handle_cash
mov cx,1
lea dx,bytes
int 21h
mov bl,sch
dec bl ;уменьшаем счетчик повторений на 1
mov sch,bl
mov ah,40h;выводим счетчик в кэш
mov bx,handle_cash
mov cx,1
lea dx,sch
int 21h
mov bl,0
mov sch,bl;обнуляем счетчик
mov dls,bl
mov bl,bytes_ne
mov bytes,bl
to_r_file:jmp read_file
cmp2end: mov bl,dls ;счетчик в bl
cmp bl,0 ;проверяем были ли повторяющиеся байты
je ex_in_arch ;если не было, то мы все заархивировали
mov ah,40h ;если были выводим последний повторившийся байт
mov bx,handle_cash
mov cx,1
lea dx,bytes
int 21h
mov bl,sch
dec bl ;уменьшаем счетчик повторений на 1
mov sch,bl
mov ah,40h;выводим счетчик в кэш
mov bx,handle_cash
mov cx,1
lea dx,sch
int 21h
mov bl,0
mov sch,bl;обнуляем счетчик
ex_in_arch:mov ah,3eh;закрываем
mov bx,handle_cash
int 21h
u_msg "” ©« §  аеЁўЁа®ў ­"
ret
in_arch endp

code ends

stack segment stack
dw 64 dup(?)
stack ends

end start

распаковка:
include userv.mac

data segment
file_name db 255 dup(?)
cash db 255 dup (?)
len db ?
handle dw ?
handle_cash dw ?
buff db ?
bytes db ?
bytes_ne db ?
sch db ?
dsl db ?
rsr db 4 dup (?)
data ends

code segment
assume cs:code, ds:data

start: mov ax,data ;передаём координаты сегмента data
mov es,ax ;в es (напомню: пара es:di)
mov cl,ds:80h ;первый байт командной строки, указывающий на длину её самой, ложим в cl
cmp cl,0 ;интересно, не равна ли она 0?
je result ;если равна - параметр не введен
dec cl ;уменьшаем cl, чтобы получить длину строки без всякого мусора
push ds ;сохраняем ds командной строки
mov ax,data;кладем в ds data
mov ds,ax
mov len,cl;теперь можно в память ложить, а то положили бы в память, совсем не относящуюся к нашей проге
pop ds;достаем ds командной строки (напомню: пара ds:si)
mov dx,1;будем использовать как флаг, в данном случае => что параметр был введен из командной
mov si,82h ;первый байт параметра (почему мы пропустили 81h? потому что там пробел)
lea di,file_name ;а di у нас показывает на имя файла, дабы потом записать параметр туда
param: cld ;ну ето понятно
lodsb ;грузим байт из командной
cmp al,0dh ;сравним с кодом enter
je inp_over ;закончим запись
stosb ;записываем символ в strok
jmp param ;возвращаемся обратно
result: mov dx,0;будем использовать как флаг, в данном случае => что параметр не был введен из командной
inp_over: mov ax,data;а теперь координаты сегмента data передаем в ds
mov ds,ax;ибо ds командной строки нам уже не нужен
cmp dx,0 ;а проверим не был ли введен параметр из командной строки?
jne to_par ;был введен
;а тут вводим, раз не был введен
inp_hand: mov  ax,0600H  ;>чистка экрана
  mov  bh,07     ;ничто иное как прокрутка на страницу
        mov  cx,0000   ;если встеришь дальше такую же функцию, смотри сюда
        mov  dx,184FH  ;>
int  10H
mov  ah,02  ;установка курсора   
        mov  bh,00     
        mov  dh,0  ;строки   
        mov  dl,0  ;столбцы, если встеришь дальше такую же функцию, смотри сюда   
        int  10H
        u_msg "‚ўҐ¤ЁвҐ Ё¬п д ©« : " ;собственно приглашение ввести параметр, которого не было в командной строке
lea dx,file_name ;эта строка в которую будет введено наше имя файла в форматировании вида
mov bx,dx ;в bx адрес strok
mov al,253 ;количество символов в строке, не 255, т.к. первые два зарезервированны
mov cl,255 ;реальное кол-во символов
mov [bx],al;в первый байт ложим длину, учитывая резервацию
mov ah,0ah;функция ввода строки
int 21h
mov dl,[bx]+1 ;в dl после этого кол-во введенных символов (второй байт)
mov len,dl;запоминаем длину в памяти
sub cl,dl ;в cl разница между реальным числом символов и введенным
lea si,file_name;адрес строки в si для movsb
mov di,si;и в di для movsb и stosb
add si,2 ;увеличиваем т.к. первые два байта зарезервированны
mv_else: ;форматируем строку, убирая все лишнее
movsb ;копируем байты
dec dl ;уменьшаем dl, он у нас как счетчик
cmp dl,0 ;сравниваем с 0
jne mv_else;если не равен то обратно
obnul: mov al,0;если равен, то дописываем 0 в конец строки
stosb;запись байта
dec cl ;аналогично cl счетчик
cmp cl,0
jne obnul
jmp to_par
to_not_ex:jmp not_ex
to_par: lea dx,file_name ;адрес строки
par: mov ah,3dh ;открыть файл
mov al,0
int 21h
jc to_not_ex ;если его не существует
mov handle,ax ;сохраняем хэндл
archiving:lea si,file_name
lea di,cash
        mov bl,len
        mov al,len
        cbw;преобразовываем длину строки из байта в слово
        add si,ax ;прибавляем к адресу строки
        push si;в стек адрес
dec_si: dec si ;уменьшаем адрес на 1
cld
        lodsb ;грузим символ
        cmp al,'\' ;сравниваем со слешем
        je name_formed ;если равно, значит имя сформированно
        dec bl;уменьшаем счетчик
        dec si;уменьшаем адрес
        cmp bl,0;сравниваем счетчик с 0
        jne dec_si;если не равен, обратно
name_formed:mov cx,0
pop bx ;в стеке лежал адрес, ну теперь он там не лежит:) а лежит в bx
disp_it: cld
lodsb
cmp al,'.'
je stp_name
dec si
movsb
inc cx
cmp si,bx;не выведем все имя
je stp_name ;если вывели то дальше
jmp disp_it;нет - продолжаем выводить
stp_name: lea si,cash
add si,cx
sub si,3
lea di,rsr
mov bx,3
mov al,'.'
stosb
t_par: cld
movsb
dec bx
cmp bx,0
jne t_par
add_dot: lea di,cash
add di,cx
sub di,3
lea si,rsr
mov bx,4
t_parin: cld
movsb
dec bx
cmp bx,0
jne t_parin
call out_arch
jmp exit
not_ex: u_msg <13,10,"ЌҐв в Є®Ј® д ©« , ­ ¦¬ЁвҐ «оЎго Є« ўЁиг (esc - ўл室)"> ;если файла не существует
u_key_sym ;просим ввести символ
cmp ax,283 ;а не esc ли это?
je exit ;да - выходим
jmp inp_hand
exit: mov ah,4Ch
        int 21h
;-----------------------------------------------------------------------
out_arch proc
mov ah,3ch;создаем файл
mov cx,00
lea dx,cash;с именем cash2
int 21h
mov handle_cash,ax
mov ah,3eh;закрываем
mov bx,handle_cash
int 21h
mov ax,3d02h;открываем в режиме записи
lea dx,cash
int 21h
mov handle_cash,ax
mov ah,3fh;функция чтения
mov al,0
mov bx,handle
lea dx,buff
mov cx,1;заносим один байт в buff
int 21h
mov al,buff
mov bytes,al
mov ah,40h;и пишем его
mov bx,handle_cash
mov cx,1
lea dx,bytes
int 21h
mov al,0
mov sch,al
mov dsl,al
read_file:mov ah,3fh
mov al,0
mov bx,handle
lea dx,buff
mov cx,1
int 21h
cmp ax,0 ;проверяем не конец ли файла
jne next_read;если не конец
jmp ex_out_arch;если конец
next_read:mov al,buff;продолжаем действия
cmp al,bytes ;равен ли только что считанный байт с предыдущим
je des_equs ;если равен то
mov cl,bytes
mov bytes_ne,cl
mov bytes,al;если не были, то в byte текущий байт
mov ah,40h;и пишем его
mov bx,handle_cash
mov cx,1
lea dx,bytes
int 21h
jmp read_file ;прыгаем обратно
des_equs: mov ah,40h
mov bx,handle_cash
mov cx,1
lea dx,bytes
int 21h
mov ah,3fh
mov al,0
mov bx,handle
lea dx,buff
mov cx,1
int 21h
mov al,buff
push ax
mov sch,al
cmp al,0
jne write_equs
pop ax
jmp suda
write_equs:mov ah,40h
mov bx,handle_cash
mov cx,1
lea dx,bytes
int 21h
mov al,sch
dec al
mov sch,al
cmp al,0
jne write_equs
pop ax
cmp al,254
je bytes_zero
suda: jmp read_file
bytes_zero:mov al,bytes_ne
mov bytes,al
jmp read_file
ex_out_arch:u_msg "” ©« а § аеЁўЁа®ў ­"
ret
out_arch endp
;-----------------------------------------------------------------------
code ends

stack segment stack
dw 64 dup(?)
stack ends

end start