Решил я сделать шифровщик, да вот ошибочка мне неизвестная: после выполнения функции 40h прерывания 21h устанавливается с-флаг и код ошибки 0005H(нет доступа). Не разъясните ли люди добрые (и злые) как исправить(пример написан на masm611)? Код (Text): cseg segment para 'code' org 100h assume cs:cseg,ds:cseg,es:cseg,ss:cseg start: xor cx,cx mov si,80h ;определение введённого имени файла and bh,00 mov bl,[si] mov al,bl inc bl mov byte ptr [si+bx],00 or al,al jz _error mov ah,9 lea dx,prompt int 21h mov ah,0ah lea dx,kliucpar int 21h cmp _len,0 jz _error mov ax,3d00h ;открытие mov dx,81h int 21h jb _error mov handle,ax mov ah,9 lea dx,loading int 21h _cht: mov bx,handle mov ah,3fh ;чтение mov cx,512d lea dx,buffer int 21h jb _error or ax,ax jz _thend mov razmer,ax mov si,offset buffer mov di,offset kliuc mov cx,ax _loop1: mov al,[si] ;шифровка в памяти mov bl,[di] cmp bl,0dh jz _kl ... inc si inc di dec cx jnz _loop1 jmp _next _kl: lea di,kliuc ;если ключ "закончился" переводим di в начало ключа jmp _loop1 ;оперируем дальше _next: mov ah,40h ;<------!!!тут происходит ошибочка!!!--- mov cx,word ptr razmer lea dx,buffer mov bx,word ptr handle int 21h jb _error jmp _cht _thend: mov ah,9 lea dx,finish int 21h ret _error: mov ah,9 lea dx,error int 21h ret prompt db 'Kliuch for shifr(20 byte max):',13,10,'$' loading db 'Loading please...',13,10,'$' error db 13,10,'*** ERROR ***$' finish db 13,10,'Finish!$' razmer dw 0 handle dw 0 kliucpar label byte maxlen db 21 _len db ? kliuc db 21 dup(00h) buffer db 512 dup(0) cseg ends end start
Прежде чем писать в файл неоходимо его открыть. Это: mov ax,3d00h ;открытие mov dx,81h int 21h не открытие файла, а бог знает что! Пример на открытие, запись и закрытие файла: ;------------------------------------------------------------ mov ah, 3ch ; Открыли файл mov cx, 0 ; c:\temp\p_16.txt mov dx, offset f_name ; int 21h ; mov handle, ax ; ;------------------------------------------------------------ ; Блок вычисления заданной функции ; m3: mov ax, x …….. ……. mov y, dx ;------------------------------------------------------------ ; Запись в файл текущего значения Х ; mov ah, 40h mov bx, handle mov cx, 2 mov dx, offset x int 21h ;----------- ; Запись в файл текущего значения Y mov ah, 40h mov dx, offset y int 21h ;------------------------ sub x, 200h ; уменьшили Х на шаг ; inc di ; увеличили содержимое ; счетчика шагов cmp di, 52h ; проверка окончания je m4 ; работы jmp m3 ; ;------------------------------------------------------------ m4: mov ah, 3eh ; Закрыли файл mov bx, handle ; int 21h ; …… ; Блок задания переменных (то бишь ".Data") ;----------------------- x dw 9800h y dw ? handle dw ? f_name db 'c:\temp\p_16.txt' ;======================= Этот пример 20 лет работает в TASMе в разных ОСях и CPU, в том числе и на Pentiume i5.
> mov dx,81h Это попытка открыть себя самого? Имхо, под NTVDM не прокатит, только в чистом Досе или под виртуалкой.
3abp_beginner Итог: ты хочешь зашифровать файл экзешника из него самого. Такое в Винде не получится. И вообще какой смысл шифровальщик для ДОС писать?
Извините, меня выкидывали с копьютера родичи. Вот ответы: Не екзешник, а тот файл который указан в аргументах, например(вызов етого "криптора"): >мой_криптор [файл_который_надо_шифровать] А всё это для тренировки мозгов и у меня судя по всему их не хватает ) Спасибо за ответ! Это работа с аргументом(чуточку выше сказано), т.е. я оптимизировал код(меньше обращений к памяти и засираний её).
3abp_beginner Ну так правильно. Ты забыл в bx хендл файла задать. И еще надо будет указатель передвинуть, иначе ты затрешь зашифрованными байтами то, что еще незашифровал
valterg > mov bx,word ptr handle это закладка хендла. криптор падает на первых 512 байтах.(так что судя по всему не в этом главная ошибка, но спасибо,учту)
valterg дело не в этом, я в отладчике(debug) поглядел, что после первого прохода по 40h int 21h выдается в код ошибки 5, ну и флаг переноса устанавливается. Т.е. дело в чём-то другом..
3abp_beginner Да батенька. Вы открыли файл на чтение и ФСЕ... Кстати 81h тоже нельзя задавать наверное. Советую проверить правильно ли читается файл. Ну и указатель все-таки придется двигать - иначе вы НАШИФРУЕТЕ.
Меня сбил с толку пост тов. 1212. Я обычно сначала исходник проверяю на работоспособность. В голове все время вертелась эта странная константа 3d00, но в ДОС-е я только тесты для новичков раз в год запускаю и забыл основательно. Внимательно посмотрел описание и ... НАШЕЛ !!!