Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на Assembler

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

rain87



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Код:
write macro s  
  lea dx,s  
  mov ah,9  
  int 21h  
endm ;макрос для вывода строки
sseg segment stack  
  db 64 dup(?)  
sseg ends  
dseg segment  
  mlen db 100  
  alen db ?  
  key db 100 dup(?) ;для ввода ключа с клавиатуры
  fname db 255 dup(?) ;сюда копируется имя файла из командной строки
  buf db 100 dup(?) ;сюда читаются данные из файла
  s0 db 13,10,'Enter the crypt key: $'  
  s1 db 'Error opening file',13,10,'$'  
  s2 db 13,10,'Press any key...',13,10,'$'  
  s3 db 'Crypting file $'  
  s4 db 13,10,'File succesfully crypted$'  
dseg ends  
cseg segment  
assume cs:cseg,ss:sseg,ds:dseg  
main proc far  
;командная строка хранится в PSP, по смещению 80h. 1й байт - длина командной строки, остальные байты - сама командная строка
;изначально, до инициализации, регистры es и ds указывают на начало PSP
;чем мы цинично и пользуемся =)
  push ds  
  xor ax,ax  
  push ax  
  mov ax,dseg  
  mov es,ax ;es указывает на сегмент данных, ds - на PSP
  ;-------------  
  mov cl,ds:[80h] ;в cl записываем длину командной строки
  xor ch,ch ;обнуляем ch, чтоб сх был равен cl
  mov si,82h ;si указывает на начало командной строки
  lea di,fname ;di указывает на fname
  rep movsb ;копируем командную строку в fname
  mov ds,ax ;инициализируем регистр ds
  mov byte ptr[di-1],0 ;в fname в конец дописываем 0 (нужно, ибо функция открытия файла требует, чтоб в конце имени был 0)
   
  lea dx,fname  
  mov ax,3d02h ;функция открытие файла в режиме чтения/записи
  int 21h ;вызываем прерыванеи ДОС
  mov byte ptr[di-1],'$' ;в fname в конец дописываем символ $ (ибо 9 функция вывода строки требует, чтоб строка заканчивалась $)
  jnc ok ;если открыли без ошибок, то переходим на ok
  write s1 ;иначе - матюкаемся
  write fname  
  jmp readkey ;и валим
ok:  
  mov bx,ax ;запоминаем дескриптор файла, возвращённый ДОСом
  write s3 ;чего-то пишем
  write fname  
  write s0  
  lea dx,mlen  
  mov ah,10  
  int 21h ;и читаем ключ
   
crypting:  
  mov cl,alen  
  xor ch,ch ;в СХ - длина ключа
  mov ah,3fh  
  lea dx,buf  
  int 21h ;читаем из файла в buf столько байт, сколько длина ключа
  mov bp,ax ;в АХ - количество реально прочитанных байт; копируем его в bp
  mov cx,ax ;и в СХ
  xor si,si ;а si - обнуляем
crypt:  
    mov al,buf[si] ;читаем очередной считанный байт
    xor al,key[si] ;ХОРим его с очередным байтом ключа
    mov buf[si],al ;и пишем обратно
    inc si ;переходим к следующему байту
  loop crypt ;да, переходим
  mov dx,bp ;в dx - количество считанных байт
  neg dx ;делаем его отрицательным
  mov cx,0ffffh ;и СХ делаем отрицательным
  mov ax,4201h ;функция перемещения указателя файла на ту позицию, с которой считали наш buf
  int 21h ;вызываем прерывание для выполнения функции
   
  lea dx,buf  
  mov cx,bp  
  mov ah,40h  
  int 21h ;пишем буфер обратно (но уже зашифрованный)
  mov ax,bp  
  cmp al,alen ;сравниваем количество обработанных (считанных, зашифрованных и записанных) байт с длиной ключа
  je crypting ;если равны - продолжаем обработку
   
  mov ah,3eh ;иначе - достигнут конец файла
  int 21h ;закрываем его
  write s4  
  ;-------------  
readkey:  
  write s2  
  xor ah,ah  
  int 16h  
  ret  
main endp  
cseg ends  
end main

Всего записей: 1744 | Зарегистр. 21-06-2006 | Отправлено: 17:21 20-01-2007 | Исправлено: rain87, 12:21 24-01-2007
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на Assembler


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru