Ошибка записи с ah=40h int 21h (05)

Тема в разделе "WASM.BEGINNERS", создана пользователем 3abp_beginner, 10 окт 2011.

  1. 3abp_beginner

    3abp_beginner New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2011
    Сообщения:
    21
    Решил я сделать шифровщик, да вот ошибочка мне неизвестная: после выполнения функции 40h прерывания 21h устанавливается с-флаг и код ошибки 0005H(нет доступа).
    Не разъясните ли люди добрые (и злые) как исправить(пример написан на masm611)?
    Код (Text):
    1. cseg segment para 'code'
    2. org 100h
    3. assume cs:cseg,ds:cseg,es:cseg,ss:cseg
    4. start:
    5.         xor cx,cx
    6.         mov si,80h                                ;определение введённого имени файла
    7.         and bh,00
    8.         mov bl,[si]
    9.         mov al,bl
    10.         inc bl
    11.         mov byte ptr [si+bx],00
    12.         or al,al
    13.         jz _error
    14.         mov ah,9
    15.         lea dx,prompt
    16.         int 21h
    17.         mov ah,0ah
    18.         lea dx,kliucpar
    19.         int 21h
    20.         cmp _len,0
    21.         jz _error
    22.         mov ax,3d00h ;открытие
    23.         mov dx,81h
    24.         int 21h
    25.         jb _error
    26.         mov handle,ax
    27.         mov ah,9
    28.         lea dx,loading
    29.         int 21h
    30. _cht:
    31.         mov bx,handle
    32.         mov ah,3fh ;чтение
    33.         mov cx,512d
    34.         lea dx,buffer
    35.         int 21h
    36.         jb _error
    37.         or ax,ax
    38.         jz _thend
    39.         mov razmer,ax
    40.         mov si,offset buffer
    41.         mov di,offset kliuc
    42.         mov cx,ax
    43. _loop1: mov al,[si] ;шифровка в памяти
    44.         mov bl,[di]
    45.         cmp bl,0dh
    46.         jz _kl
    47.         ...
    48.         inc si
    49.         inc di
    50.         dec cx
    51.         jnz _loop1
    52.         jmp _next
    53. _kl:
    54.         lea di,kliuc ;если ключ "закончился" переводим di в начало ключа
    55.         jmp _loop1 ;оперируем дальше
    56. _next:
    57.         mov ah,40h  ;<------!!!тут происходит ошибочка!!!---
    58.         mov cx,word ptr razmer
    59.         lea dx,buffer
    60.         mov bx,word ptr handle
    61.         int 21h
    62.         jb _error
    63.         jmp _cht
    64. _thend:
    65.        mov ah,9
    66.        lea dx,finish
    67.        int 21h
    68.        ret
    69. _error:
    70.         mov ah,9
    71.         lea dx,error
    72.         int 21h
    73.         ret
    74. prompt db 'Kliuch for shifr(20 byte max):',13,10,'$'
    75. loading db 'Loading please...',13,10,'$'
    76. error db 13,10,'*** ERROR ***$'
    77. finish db 13,10,'Finish!$'
    78. razmer dw 0
    79. handle dw 0
    80. kliucpar label byte
    81. maxlen db 21
    82. _len db ?
    83. kliuc db 21 dup(00h)
    84. buffer db 512 dup(0)
    85. cseg ends
    86. end start
     
  2. 1212

    1212 New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2009
    Сообщения:
    21
    Прежде чем писать в файл неоходимо его открыть.
    Это:

    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.
     
  3. iamlamer

    iamlamer New Member

    Публикаций:
    0
    Регистрация:
    20 июн 2005
    Сообщения:
    273
    Адрес:
    Russia
    > mov dx,81h

    Это попытка открыть себя самого? Имхо, под NTVDM не прокатит, только в чистом Досе или под виртуалкой.
     
  4. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    3abp_beginner
    Итог: ты хочешь зашифровать файл экзешника из него самого. Такое в Винде не получится. И вообще какой смысл шифровальщик для ДОС писать?
     
  5. 3abp_beginner

    3abp_beginner New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2011
    Сообщения:
    21
    Извините, меня выкидывали с копьютера родичи. Вот ответы:
    Не екзешник, а тот файл который указан в аргументах, например(вызов етого "криптора"):
    >мой_криптор [файл_который_надо_шифровать]
    А всё это для тренировки мозгов и у меня судя по всему их не хватает )
    Спасибо за ответ!
    Это работа с аргументом(чуточку выше сказано), т.е. я оптимизировал код(меньше обращений к памяти и засираний её).
     
  6. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    3abp_beginner
    Ну так правильно. Ты забыл в bx хендл файла задать. И еще надо будет указатель передвинуть, иначе ты затрешь зашифрованными байтами то, что еще незашифровал :)
     
  7. 3abp_beginner

    3abp_beginner New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2011
    Сообщения:
    21
    valterg
    > mov bx,word ptr handle
    это закладка хендла.
    криптор падает на первых 512 байтах.(так что судя по всему не в этом главная ошибка, но спасибо,учту)
     
  8. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Я проглядел, что bx в предыдущем вызове грузится...
    Значит тогда дело в указателе.
     
  9. 3abp_beginner

    3abp_beginner New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2011
    Сообщения:
    21
    valterg
    дело не в этом, я в отладчике(debug) поглядел, что после первого прохода по 40h int 21h
    выдается в код ошибки 5, ну и флаг переноса устанавливается.
    Т.е. дело в чём-то другом..
     
  10. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    3abp_beginner
    Да батенька. Вы открыли файл на чтение и ФСЕ...
    Кстати 81h тоже нельзя задавать наверное. Советую проверить правильно ли читается файл.
    Ну и указатель все-таки придется двигать - иначе вы НАШИФРУЕТЕ.
     
  11. 3abp_beginner

    3abp_beginner New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2011
    Сообщения:
    21
    valterg
    Спасибо большое, до меня бы не допёрло.
     
  12. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Меня сбил с толку пост тов. 1212. Я обычно сначала исходник проверяю на работоспособность.
    В голове все время вертелась эта странная константа 3d00, но в ДОС-е я только тесты для новичков раз в год запускаю и забыл основательно.
    Внимательно посмотрел описание и ... НАШЕЛ !!!