1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

несколько способов создания файла в DOS

Тема в разделе "WASM.A&O", создана пользователем Mikl___, 5 мар 2012.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.930
    Знаю, что БАЯН, но вдруг кому-то пригодится
    1)
    Код (ASM):
    1. ; masm dos com #
    2. .model tiny
    3. .286
    4. .CODE
    5. org 100h
    6. start:  mov ah,3Ch
    7.         mov cx,0; атрибуты файла
    8.         mov dx,offset filename
    9.         int 21h
    10.         retn
    11. filename db 'myfile.txt',0
    12. end start
    2)
    Код (ASM):
    1. ; masm dos com #
    2. .286
    3. .model tiny
    4. .code
    5. org 100h
    6. start:  mov ah,5Bh
    7.         mov cx,0; атрибуты файла
    8.         mov dx,offset filename
    9.         int 21h
    10.         retn
    11. filename db 'myfile.txt',0
    12. end start
    3)
    Код (ASM):
    1. ; masm dos com #
    2. .286
    3. .model tiny
    4. .code
    5. org 100h
    6. start:  mov cx,0; атрибуты файла - обычный файл
    7.         mov bx,2 ;режим доступа чтение-запись
    8.         mov dx,10h
    9.         mov si,offset filename;указатель на имя файла
    10.         mov ah,6Ch
    11.         int 21h ;создаем файл
    12.         retn
    13. filename db 'myfile.txt',0
    14. end start
    4) создаем файл с длинным именем (до 255 символов) и чуствительным к регистру
    Код (ASM):
    1. ; masm dos com #
    2. .286
    3. .model tiny
    4. .code
    5. org 100h
    6. start:  mov cx,0; атрибуты файла - обычный файл
    7.         mov bx,2 ;режим доступа чтение-запись
    8.         mov dx,10h
    9.         mov si,offset filename;указатель на имя файла
    10.         mov ax,716Ch
    11.         int 21h
    12.         retn
    13. filename db 'myfile.txt',0
    14. end start
    5) через FCB
    Код (ASM):
    1. ; masm dos com #
    2. .286
    3. .model tiny
    4. .code
    5. org 100h
    6. FCB struct
    7.         drive_num       db ?
    8.         file_name       db 8 dup(20h)
    9.         file_ext        db 3 dup(20h)
    10.         block_num       dw ?
    11.         record_size     dw ?
    12.         file_size       dd ?
    13.         file_data       dw ?
    14.         rezerved        db 10 dup(?)
    15.         current_rec     db ?
    16.         random_rec      dd ?
    17. FCB ends
    18. start:  mov ah,16h
    19.         mov dx,offset fcb
    20.         int 21h
    21.         ret
    22. fcb FCB <0,'myfile','txt'>
    23. ;0 - диск по умолчанию, далее 8-байтовое имя файла
    24. ;если меньше, то заполняется пробелами, далее 3-байтовое расширение
    25. end start
    6) создаем файл при помощи набора команд DOS
    Код (ASM):
    1. ; masm dos com #
    2. .286
    3. .model tiny
    4. .code
    5. org 100h
    6. start:  mov bx,100h     ;выделим блок памяти в 256 параграфов
    7.         mov ah,4Ah              
    8.         int 21h
    9.         mov bx,offset parametrs ;указываем на блок параметров
    10.         mov [bx+4],cs
    11.         mov dx,offset filename
    12.         mov ax,4B00h;загрузить и выполнить программу из командной строки
    13.         int 21h
    14.         retn        ;выход в DOS
    15. command_line db N,'/c copy nul myfile.txt',0Dh
    16. N = $-command_line-1;длина командной строки
    17. ;командная строка типа pascal, начинается с байта длины строки, заканчивается
    18. ;ASCII-кодом клавиши Enter (0Dh). При передаче команды CMD.EXE нужно указать /С перед
    19. ;строкой (требование вызова вторичного командного процессора). Программу cmd.exe
    20. ;из папки windows\system32\ проще разместить в том же каталоге, что и программа
    21. filename db 'cmd.exe',0
    22. parametrs dw 0,command_line,5 dup(0);блок параметров
    23. end start
    7) Загрузить COMMAND.COM и настроить его по месту в памяти не используя функцию 4Bh прерывания 21h
    Код (ASM):
    1. ; masm dos com #
    2. .286
    3. .model tiny
    4. .code
    5. org     100h
    6. start:  mov ah,4Ah      ;модифицируем назначенную память
    7.         mov bx,100h     ;новый размер блока в параграфах
    8.         int 21h        
    9.         or bx,-1        ;требуемое число параметров для выполнения
    10.         mov ah,48h      ;вделить блок памяти
    11.         int 21h         ;возвращает в bx размер наибольшего доступного блока
    12. ;памяти в параграфах
    13.         mov ah,48h      ;вделить блок памяти, в bx действительно доступная память
    14.         int 21h         ;возвращает в ах сегментный адрес выделенного блока
    15.         mov es,ax       ;es:=new PSP
    16.         mov ss,ax       ;ss:=new PSP
    17.         xchg dx,ax      ;dx:=new PSP
    18.         mov ah,26h      ;создать новый префикс программного сегмента
    19.         int 21h        
    20.         mov dx,offset filename
    21.         mov di,80h      ;указатель на командную строку
    22.         mov cx,(N+1)/2  ;копируем по два байта за раз, N округлен в большую
    23. ;сторону к числу кратному два, поэтому добавочный movsb не нужен
    24.         mov si,offset command_line
    25.         rep movsw       ;создаем командную строку для запуска command.com
    26.         mov ax,3D00h    ;открыть command.com на чтение
    27.         int 21h
    28.         xchg bx,ax      ;дескриптор файла в bx
    29.         xor cx,cx       ;cx=dx=0
    30.         xor dx,dx
    31.         mov ax,4202h    ;установить файловый указатель на конец файла
    32.         int 21h
    33.         push ax         ;сохраним в стеке длину файла command.com
    34.         mov ax,4200h    ;установить файловый указатель на начало файла
    35.         int 21h
    36.         mov dx,es       ;пересчитываем чему должен быть равен dx из расчета,
    37.         add dx,10h      ;что cs*10h+dx=es*10h+100h
    38.         mov cx,cs
    39.         sub dx,cx
    40.         shl dx,4        ;в dx адрес буфера, куда будет скопирован command.com
    41.         pop cx          ;в сх число байтов для чтения
    42.         mov ah,3Fh      ;читаем command.com в буфер
    43.         int 21h
    44.         mov ah,3Eh      ;закрыть файл command.com
    45.         int 21h
    46.         mov ax,es       ;ds:=new PSP
    47.         mov ds,ax       ;при старте СОМ-файла cs=ds=es=ss=PSP ip=100h
    48.         push es         ;новое значение cs:=new PSP
    49.         push 100h       ;новое значение ip:=100h
    50.         retf            ;запускаем command.com для создания файла myfile.txt
    51. filename db 'c:\windows\system32\command.com',0;полный путь к command.com
    52. command_line db N-1,'/c copy > myfile.txt',0Dh
    53. N = $ - command_line
    54. db 0; если N нечетное, то скопируется и добавочный нулевой символ
    55. end     start
    8) имитируем вызов int 21h
    Код (ASM):
    1. ; masm dos com #
    2. .286
    3. .model tiny
    4. .code
    5. org 100h
    6. start:
    7. ;получаем дальний адрес (cs:ip) обработчика
    8. ;прерывания 21h из таблицы векторов прерывания
    9.         push 0;сегментный адрес таблицы векторов прерывания в es      
    10.         pop es        
    11.         mov di,es:[21h*4];смещение обработчика прерывания 21h в di
    12.         mov si,es:[21h*4+2];сегмент обработчика прерывания 21h в si
    13. ;параметры для функции 3Ch прерывания 21h
    14.         mov cx,0        ;аттрибуты файла (обычный файл)
    15.         mov dx,offset filename;имя создаваемого файла
    16.         mov ah,3Ch      ;номер функции
    17. ;три параметра в стек для возврата из прерывания
    18.         pushf          
    19.         push cs
    20.         push offset @f  ;адрес возврата
    21. ;имитируем вызов int 21h
    22.         push si         ;cs для int 21h
    23.         push di         ;ip для int 21h
    24.         retf            ;подменяем cs и ip
    25. @@:     mov ah,4Ch      ;выход из программы
    26.         int 21h
    27. filename db 'myfile.txt',0
    28. end start
    9)
    Код (ASM):
    1. ; masm dos com #
    2. .286
    3. .model tiny
    4. .code
    5. org 100h
    6. FCB struct
    7.     drive_num    db ?
    8.     file_name    db 8 dup(20h)
    9.     file_ext    db 3 dup(20h)
    10.     block_num    dw ?
    11.     record_size    dw ?
    12.     file_size    dd ?
    13.     file_data    dw ?
    14.     rezerved    db 10 dup(?)
    15.     current_rec    db ?
    16.     random_rec    dd ?
    17. FCB ends
    18. start:    push offset @f    ; Занести в стек флаги, сегмент
    19.     push cs           ;    и смещение адреса возврата
    20.     pushf             ;    в обратном порядке.
    21.     mov cl,16h
    22.     mov dx,offset fcb
    23.     jmp dword ptr ALT_DOS_PTR ; Выполнить функцию.
    24. @@:    mov ah,4Ch
    25.     int 21h  
    26. fcb FCB <0,'myfile','txt'>
    27. ;0 - диск по умолчанию, далее 8-байтовое имя файла
    28. ;если меньше, то заполняется пробелами, далее 3-байтовое расширение
    29. ALT_DOS_PTR dw    0C0h,0;адрес для перехода в альтернативный обработчик
    30. end start
     
    Последнее редактирование: 24 ноя 2019
    >Quiet Snow< нравится это.
  2. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    ну тогда надо еще низкоуровневый. Без ДОС (через int 13). Чтение FAT, запись имени файла, указание размера, связывание его с одним из кластеров или секторов.
    (самый-самый низкоуровневый через порты не предлагаю - это уже для джедаев)

    Зы: когда то была классная шутка/защита от копирования дискет - на дискете помечаешь размер файла в 4Гб, и все попытки ее скопировать идут лесом... Ни средствами ДОС, ни в винде, ни создание образа дискеты не помогут.
     
  3. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    535
    Дискеты щас не модно. Сейчас надо ячейки на дешевых флешках небольшой емкости выжигать, как раньше дырки на дискетах кололи :)
     
  4. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    А я давно хотел память на феррите запилить. Чисто ради интереса, сотню ферритовых колец и не много логики отечественной. К стати раздобыл немного литров ртути, можно на ней тоже сделать. Но стрёмно, она токсичная.
     
  5. 1212

    1212 New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2009
    Сообщения:
    21
    Mikl___ приведите для всех Ваших примеров полный комплект действий с файлом: открытие файла, запись в файл, закрытие файла. В противном случае юные асмитсты не смогут увидеть прелестей DOS-программ.
    Для первого варианта:
    открытие файла - Вы показали, но я бы добавил
    Код (ASM):
    1. .....
    2. int 21h
    3. mov handle, ax;
    запись в файл -
    Код (ASM):
    1. mov ah,40h
    2. mov bx,handle
    3. mov cx,4 ;  длинна записи в байтах
    4. mov dx,offset x:  х - записываемая переменная
    5. int 21h;
    закрытие файла -
    Код (ASM):
    1. mov ah,3eh
    2. mov bx, handle
    3. int 21h
    Прошу простить, если я опередил Ваши мысли и Вы собирались эту информацию поместить позже!
     
    Последнее редактирование модератором: 24 ноя 2019
  6. 1212

    1212 New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2009
    Сообщения:
    21
    В догонку:
    при записи переменной х в СХ записано 4, так как переменная х определена размером DD - четыре байта
    х dd ?
     
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.930
    10) Перечитывая Зубкова наткнулся на еще один способ
    Код (ASM):
    1. ; masm dos com #
    2. .286
    3. .model tiny
    4. .code
    5. org 100h
    6. start:  mov si,offset string
    7.     mov cx,N
    8. @@:    push cx
    9.     lodsb
    10.     mov ah,5      ;номер функции
    11.     mov cl,al;передача параметра через регистр CL, содержимое CH=0
    12.     int 16h
    13.     pop cx
    14.     loop @b
    15.     retn
    16. string db 'copy>myfile.tx',0Dh; не более 15 символов
    17. N = $ - string
    18. end start
    Там в главе "Основы программирования для MS-DOS" 4.4.2 Ввод с клавиатуры. Средства BIOS. Пример, который имитирует набор на клавиатуре команды DIR, через 5 функцию 16h прерывания. Но стоит примечание
    У меня под FAR'ом программа работала, но попытка создать файл через "COPY > myfile.txt" не работала, пока опытным путем я не установил, что длина всей строки не должна быть больше 15 символов, обязательно заканчиваться на 0Dh (ASCII-код Enter)
    11) через int 2Eh
    Код (ASM):
    1. ; masm dos com #
    2. .286
    3. .model tiny
    4. .code
    5. org 100h
    6. start:  mov ah,4Ah  ;allow mem alloc.
    7.     mov bx,10h  ;новый размер блока в параграфах
    8.     int 21h
    9.     mov si,offset command_line
    10.     int 2Eh ; execute a command using BASE LEVEL
    11.     mov ah,4Ch  ;выходим из программы
    12.     int 21h
    13. command_line db N,'copy > myfile.txt',0Dh
    14. N = $ - command_line - 1
    15. end  start
    MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА
    На самом деле символ 0Dh можно как включать в длину строки, так и не включать в неё — и в том и в другом случае программа работает. По всей видимости int 2Eh используется в Волков Коммандере (VC.COM), по крайней мере, у Всеволода В. Волкова в book.lib.rus.ec/books/VCINFO.TXT я нашел такую фразу
    12)
    Код (ASM):
    1. ; masm dos com #
    2. .286
    3. .model tiny
    4. .code
    5. org 100h
    6. start:  xor cx,cx; атрибуты файла
    7.     mov es,cx
    8.     les bx,es:[4*21h];читаем адрес текущего обработчика int 21h
    9.     mov ofs21,bx
    10.     mov seg21,es
    11.     mov ah,3Ch
    12.     mov dx,offset filename
    13.     pushf; вызываем прерывание 21h
    14.     db 9Ah;дальний вызов процедуры с указанием непосредственного адреса
    15.     ofs21 dw ?
    16.     seg21 dw ?
    17.     retn
    18. filename db 'myfile.txt',0
    19. end start
    13)
    Код (ASM):
    1. ; masm dos com #
    2. .286
    3. .model tiny
    4. .code
    5. org 100h
    6. start:  xor cx,cx; атрибуты файла
    7.     push ds
    8.     mov ds,cx
    9.     mov si,4*21h;читаем адрес текущего обработчика int 21h
    10.     mov di,offset ofs21
    11.     movsw
    12.     movsw
    13.     pop ds
    14.     mov ah,3Ch
    15.     mov dx,offset filename
    16.     pushf
    17.     call dword ptr ofs21; вызываем прерывание 21h
    18.     retn
    19. filename db 'myfile.txt',0
    20. ofs21 dd ?
    21. end start
     
    Последнее редактирование: 24 ноя 2019
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.930
    Выдираю из io.sys (можно из ntvdm) кусок 21h прерывания, отвечающего за создание файла. Во вложении сорц и СОМ-файл создающий файл на диске и не использующий прерывания. Строго не судите
    Код (ASM):
    1. ; masm dos com #
    2. ;.286
    3. .model tiny
    4. .code
    5. .386
    6. org 100h
    7. start:  mov cx,0;аттрибуты файла
    8.     pushf;три параметра для iret
    9.     push cs
    10.     push return
    11.     cli;вход в прерывание 21h
    12.     push es
    13.     push ds
    14.     pusha
    15.     mov ax,ds
    16.     mov ds,cs:new_DS ; 0A7
    17.     mov ds:[5EEh],ax;old DS
    18.     mov ds:[5ECh],bx; сохранили BX
    19.     mov ax,ds:[586h]
    20.     mov ds:[5F4h],ax
    21.     mov ax,ds:[588h]
    22.     mov ds:[5F2h],ax
    23.     mov byte ptr ds:[575h],0
    24.     test byte ptr ds:[100Eh],1
    25.     jnz @f
    26.     mov word ptr ds:[340h],0;ax
    27. @@: inc byte ptr ds:[323h]
    28.     mov ds:[586h],sp
    29.     mov ds:[588h],ss
    30.     mov ax,ds:[332h];0F53h
    31.     mov ds:[33Eh],ax
    32.     mov ds,ax
    33.     mov ds:[2Eh],sp
    34.     mov ds:[30h],ss
    35.     mov ss,cs:new_DS
    36.     mov sp,7A2h
    37.     sti
    38.     mov ds,cs:new_DS
    39.     mov byte ptr ss:[5F8h],0
    40.     and word ptr ss:[613h],800h
    41.     mov word ptr ss:[359h],100h
    42.     mov byte ptr ss:[34Eh],0
    43.     mov byte ptr ss:[34Ch],0
    44.     mov word ptr ss:[33Ch],3C00h;аргумент "создать файл"
    45.     mov byte ptr ss:[322h],0
    46.     mov word ptr ss:[324h],01FFh
    47.     mov byte ptr ss:[35Ah],0
    48.     mov sp,922h
    49.     mov bx,6CA9h
    50.     xchg bx,ss:[5ECh]
    51.     mov ds,ss:[5EEh]
    52.     call sub_6CA9
    53.     and byte ptr ss:[86h],0FBh
    54.     cli
    55.     mov ds,cs:new_DS
    56.     dec byte ptr ds:[323h]
    57.     lss sp,ds:[586h]
    58.     mov bp,sp
    59.     mov [bp],al
    60.     mov ax,ds:[5F4h]
    61.     mov ds:[586h],ax
    62.     mov ax,ds:[5F2h]
    63.     mov ds:[588h],ax
    64.     popa ;выход из прерывания 21h
    65.     pop ds
    66.     pop es
    67.     push ds
    68.     mov ds,cs:[new_DS]
    69.     test byte ptr ds:[1482h],2
    70.     pop ds
    71.     jmp loc_5424
    72.  
    73. sub_2742 proc ;из 2 мест
    74.     mov ds,cs:[new_DS]
    75.     lds si,ds:[586h]
    76.     retn
    77. sub_2742 endp
    78.  
    79. sub_3401 proc; копируем строку  (вызов из трех мест)
    80. @@: movsb
    81.     cmp byte ptr [si-1],0
    82.     jnz @b
    83.     retn
    84. sub_3401 endp
    85. sub_340A proc ;в CX длина строки на которую указывает DI
    86.     push di  ;(вызов из двух мест)
    87.     push ax
    88.     mov cx,0FFFFh
    89.     xor al,al
    90.     repne scasb
    91.     not cx
    92.     pop ax
    93.     pop di
    94.     retn
    95. sub_340A endp
    96.  
    97. loc_4B13: mov dx,ax
    98.     push di
    99.     push si
    100.     mov di,si
    101. loc_4B19: lodsb
    102.     or al,al
    103.     jz loc_4B27
    104.     call sub_4F79
    105.     jnz loc_4B19
    106.     mov di,si
    107.     jmp short loc_4B19
    108. loc_4B27: mov si,di
    109.     push ds
    110.     push si
    111.     push dx
    112.     call sub_4EB7
    113.     pop dx
    114.     cmp byte ptr [si],0
    115.     stc
    116.     jnz loc_4B3D
    117.     push ss
    118.     pop ds
    119.     push dx
    120.     push si
    121.     push di
    122.     push cx
    123.     push ax
    124.     push word ptr ds:[54Eh]
    125.     cmp byte ptr ds:[54Eh],5
    126.     jnz @f
    127.     mov byte ptr ds:[54Eh],0E5h ; 'х'
    128. @@: test byte ptr ds:[56Eh],8
    129.     jnz @f
    130.     mov si,48h ; 'H'
    131. loc_4AA4: test word ptr [si+4],8000h
    132.     jz loc_4ABC
    133.     mov ax,si
    134.     add si,0Ah
    135.     mov di,54Eh
    136.     mov cx,4
    137.     repe cmpsw
    138.     mov si,ax
    139.     jnz loc_4ABC;D1
    140.     mov ss:59Eh,ds
    141.     mov bh,[si+4]
    142.     or bh,0C0h
    143.     and bh,0DFh
    144.     mov ss:[59Ch],si
    145.     jmp a3
    146. loc_4ABC: lds si,[si]
    147.     cmp si,0FFFFh
    148.     jnz loc_4AA4
    149. @@: stc
    150. a3: mov cx,ss
    151.     mov ds,cx
    152.     pop word ptr ds:[54Eh]
    153.     pop ax
    154.     pop cx
    155.     pop di
    156.     pop si
    157.  
    158.     pop dx
    159. loc_4B3D: pop si
    160.     pop ds
    161.     pop di
    162.     jb loc_4B6E
    163.     cmp si,di
    164.     jnz loc_4B4A
    165.     xor dx,dx
    166.     jmp short loc_4B70
    167. loc_4B4A: mov al,[si]
    168.     push ax
    169.     mov byte ptr [si],0
    170.     push si
    171.     mov si,di
    172.     cmp dl,0
    173.     jnz near ptr unk_4B5D
    174.     mov dl,ss:338h
    175. unk_4B5D db 0C4h,0C4h ; -
    176.     push ax
    177.     inc sp
    178.     jnb loc_4B66
    179.     call loc_51F0
    180. loc_4B66: pop si
    181.     pop ax
    182.     mov [si],al
    183.     jnb loc_4B70
    184.     inc dx
    185.     clc
    186. loc_4B6E: mov si,di
    187. loc_4B70: pop di
    188.     cmc
    189.     retn
    190.  
    191. sub_4EB7 proc
    192.     mov byte ptr ss:[350h],1
    193.     push ss
    194.     pop es
    195.     mov di,54Eh
    196.     push di
    197.     mov ax,2020h
    198.     mov cx,5
    199.     stosb
    200.     rep stosw
    201.     xor al,al
    202.     mov dl,al
    203.     stosb
    204.     pop di
    205.     mov cx,8
    206.     call sub_4F23
    207.     jnbe loc_4E79
    208.     add di,cx
    209.     jmp a6
    210. loc_4E79: dec si
    211. loc_4E83:: call sub_4F23
    212.     jnz loc_4E94
    213.     test byte ptr ss:350h,0FFh
    214.     jz loc_4EA9
    215.     cmp al,' '
    216.     jnz loc_4EA9
    217. loc_4E94: jcxz loc_4E83
    218.     dec cx
    219.     cmp al,'*'
    220.     jnz loc_4E9F
    221.     mov al,'?'
    222.     rep stosb
    223. loc_4E9F: stosb
    224.     cmp al,'?'
    225.     jnz loc_4E83
    226.     or dl,1
    227.     jmp short loc_4E83
    228. loc_4EA9: mov al,' '
    229.     rep stosb
    230. a6: dec si
    231.  
    232.     cmp byte ptr [si],'.'
    233.     jnz loc_4E6F
    234.     inc si
    235.     test byte ptr ss:614h,1
    236.     jz loc_4E69
    237.     movsb
    238.     mov cx,2
    239.     jmp short loc_4E6C
    240. loc_4E69: mov cx,3
    241. loc_4E6C: call loc_4E83
    242. loc_4E6F: mov al,dl
    243.     and word ptr ss:613h,0FEFFh
    244.  
    245.     cmp byte ptr ss:54Eh,0E5h ; 'х'
    246.     jnz @f
    247.     mov byte ptr ss:54Eh,5
    248. @@: retn
    249. sub_4EB7 endp
    250. table_4EE4:
    251. db 4 dup(66h),6,0Bh dup(66h),0F8h,0F6h,3 dup(0FFh)
    252. db 4Fh,0F4h,6Eh,5 dup(0FFh),44h,44h,0F4h,0Dh dup(0FFh)
    253. db 6Fh,66h,0Fh dup(0FFh),0F4h
    254.  
    255. sub_4F23 proc ;вызов из двух мест
    256.     lodsb
    257. sub_4F24:: push bx
    258.     mov bx,offset table_0B33
    259.     cmp al,'a'
    260.     jb loc_4F40
    261.     cmp al,'z'
    262.     ja @f
    263.     sub al,20h ;превращаем строчные латинские буквы в прописные
    264. @@: cmp al,80h ;максимальное значение
    265.     jb loc_4F40
    266.     sub al,80h; в AL значения от 0 до 7Fh
    267.     push ds
    268.     mov ds,cs:[new_DS]
    269.     xlat
    270.     pop ds
    271. loc_4F40: push ax
    272.     cmp al,7Eh ; '~'
    273.     jb loc_4F76
    274.     mov al,0Fh
    275.     jmp a7
    276. loc_4F76: push bx
    277.     mov bx,offset table_4EE4
    278.     shr al,1; в AL значения от 0 до 7Fh
    279.     xlat byte ptr cs:[bx]
    280.     pop bx
    281.     jnb loc_4F73
    282.     shr al,4
    283. loc_4F73: and al,0Fh
    284. a7:     test al,1
    285.     pop ax
    286.     pop bx
    287.     retn
    288. sub_4F23 endp
    289.  
    290. sub_4F79 proc ;вызов из 13 мест
    291.     cmp al,'/'
    292.     jbe loc_4F83
    293.     cmp al,'\'
    294.     retn
    295. loc_4F80: mov al,'\'
    296.     retn
    297. loc_4F83: jz loc_4F80
    298.     retn
    299. sub_4F79 endp
    300.  
    301. loc_51F0: cmp byte ptr ss:12FCh,0
    302.     stc
    303.     jnz loc_51FA
    304.     retn
    305. loc_51FA: mov al,ss:12FDh
    306.     push ax
    307.     mov byte ptr ss:34Dh,18h
    308.     call sub_521A
    309.     cmp al,1
    310.     jz loc_5212
    311.     pop ax
    312.     add ax,13h
    313.     stc
    314.     retn
    315. loc_5212: pop ax
    316.  db 0C4h,0C4h ; -
    317.     push ax
    318.     xor si,[bp+si-29h]
    319.     retn
    320.  
    321. sub_521A proc
    322.     xchg ax,di
    323.     and di,0FFh
    324.     xor ah,ah
    325.     or ah,ss:[34Dh]
    326.     mov al,ss:[12FEh]
    327.     mov word ptr ss:[3B7h],0
    328.     cmp al,0FFh
    329.     jnz loc_523F
    330.     or ah,80h
    331.     or word ptr ss:[3B7h],8000h
    332. loc_523F: mov ss:[584h],es
    333.     mov ss:[582h],bp
    334.     mov si,3B3h
    335.     mov bp,ss
    336. sub_521A endp
    337.  
    338. loc_5424: push ds
    339.     push ax
    340.     mov ax,40h
    341.     mov ds,ax
    342.     test word ptr ds:[314h],2400h
    343.     jnz loc_5482
    344.     push bp
    345.     mov bp,sp
    346.     mov ax,[bp+0Ah]
    347.     pop bp
    348.     test ax, 100h
    349.     jnz loc_5482
    350.     test ax,200h
    351.     jz loc_5466
    352.     lock or word ptr ds:314h,200h
    353.     test word ptr ds:314h,3
    354.     jz loc_5453
    355. loc_5482: pop ax
    356.     pop ds
    357.     iret
    358. return: ret; завершаем программу
    359. loc_5466: lock and word ptr ds:314h, 0FDFFh
    360. loc_5453: xchg ah,al
    361.     cld
    362.     test al, 4
    363.     jz loc_545A
    364.     std
    365. loc_545A: test al,8
    366.     jnz loc_546F
    367.     jo loc_5479
    368. loc_5460: sahf
    369.     pop ax
    370.     pop ds
    371.     retf 2;выход по ошибке
    372. loc_546F: jo loc_5460
    373.     stc
    374.     jmp short loc_5460
    375. loc_5479: clc
    376.     jmp short loc_5460
    377. ;------------------------------------
    378. sub_6168 proc
    379.     xor bx,bx
    380. loc_616A: mov es,cs:[new_DS]
    381.     mov es,es:332h
    382.     cmp bx,es:32h
    383.     jb @f
    384.     mov al,6;недопустимый дескриптор
    385.     stc
    386.     retn
    387. @@: les di,es:[34h]
    388.     add di,bx
    389.     jb @f
    390.     cmp byte ptr es:[di],0FFh
    391.     jz locret_617A
    392.     inc bx
    393.     jmp short loc_616A
    394. @@: mov al,4;открыто слишком много файлов (нет свободных дескрипторов)
    395. locret_617A: retn
    396. sub_6168 endp
    397.  
    398. sub_613D proc
    399.     mov es,cs:[new_DS] ;cs:word_2257
    400.     les di,es:2Ah
    401. loc_6147: cmp bx,es:[di+4]
    402.     jb loc_615B
    403.     sub bx,es:[di+4]
    404.     les di,es:[di]
    405.     cmp di,0FFFFh
    406.     jnz loc_6147
    407.     stc
    408.     retn
    409. loc_615B: push ax
    410.     mov ax,33
    411.     mul bl
    412.     add di,ax
    413.     pop ax
    414.     add di,6
    415.     retn
    416. sub_613D endp
    417.  
    418. sub_617B proc
    419.     push ax
    420.     xor bx,bx
    421. loc_617E: push bx
    422.     call sub_613D
    423.     pop bx
    424.     jb loc_61AE
    425.     cmp word ptr es:[di],0
    426.     jz loc_619E
    427.     cmp word ptr es:[di],0FFFFh
    428.     jz loc_6194
    429. loc_6191: inc bx
    430.     jmp short loc_617E
    431. loc_6194: mov ax,ss:33Eh
    432.     cmp es:[di+1Bh],ax
    433.     jnz loc_6191
    434. loc_619E: mov word ptr es:[di],0FFFFh
    435.     mov ax,ss:33Eh
    436.     mov es:[di+1Bh],ax
    437.     pop ax
    438.     clc
    439.     retn
    440. loc_61AE: pop ax
    441.     mov al,4
    442.     retn
    443. sub_617B endp
    444. sub_6659 proc
    445.     push ax
    446.     les di,ss:5A4h
    447.     mov word ptr es:[di+43h],0
    448.     cmp al,'Z'
    449.     jna loc_6681
    450.     stc
    451.     jmp short @f
    452. loc_6681: mov ah,':'
    453.     mov es:[di],ax
    454.     mov word ptr es:[di+2],'\'
    455.     or byte ptr es:[di+44h],40h
    456.     mov al,2
    457.     mov es:[di+45h],ax
    458. @@: pop ax
    459.     retn
    460. sub_6659 endp
    461.  
    462. sub_66BA proc
    463.     call sub_66D7
    464.     jb @f
    465.     push ds
    466.     push si
    467.     lds si,ss:5A4h
    468.     test word ptr [si+43h],2000h
    469.     pop si
    470.     pop ds
    471.     jz @f
    472.     mov byte ptr ss:612h,0Fh
    473.     stc
    474. @@: retn
    475. sub_66BA endp
    476.  
    477. sub_66D7 proc
    478.     or al,al
    479.     jnz loc_66E0
    480.     mov al,ss:338h
    481.     inc ax
    482. loc_66E0: dec ax
    483.     push ds
    484.     push si
    485.     mov byte ptr ss:325h,2
    486.     test byte ptr ss:575h,0FFh
    487.     jz loc_6712
    488.     push ax
    489.     push es
    490.     push di
    491.     mov word ptr ss:5A4h,507h
    492.     mov ss:5A6h,ss
    493.     add al,'A'
    494.     call sub_6659
    495.     test word ptr es:[di+43h],4000h
    496.     pop di
    497.     pop es
    498.     pop ax
    499.     jz loc_671E
    500.     jmp short loc_672B
    501. loc_6712: call loc_672E
    502.     jb loc_671E
    503.     test word ptr [si+43h],4000h
    504.     jnz loc_672B
    505. loc_671E: mov al,0Fh
    506.     mov ss:612h,al
    507.     mov byte ptr ss:325h,1
    508.     stc
    509. loc_672B: pop si
    510.     pop ds
    511.     retn
    512. sub_66D7 endp
    513. loc_672E: cmp byte ptr ss:13CDh,0
    514.     jz loc_6762
    515.     push bx
    516.     push cx
    517.     lds si,ss:3Ch
    518.     mov cl,ss:47h
    519.     xor ch,ch
    520. loc_6744: or word ptr [si+43h],800h
    521.     mov bx,47h ; 'G'
    522.     add si,bx
    523.     loop loc_6744
    524.     pop cx
    525.     pop bx
    526.     mov byte ptr ss:13CDh,0
    527.     mov si,13F5h
    528.     push ss
    529.     pop ds
    530.     or word ptr [si+43h],0C00h
    531. loc_6762: cmp al,ss:47h
    532.     jb loc_6789
    533.     cmp al,19h
    534.     ja loc_6787
    535.     mov si,13F5h
    536.     push ss
    537.     pop ds
    538.     push ax
    539. db 0C4h,0C4h ; -
    540.     push sp
    541.     add al,58h ; 'X'
    542.     jb loc_6787
    543.     mov word ptr [si+45h],2
    544.     mov word ptr [si+43h],4400h
    545.     jmp short loc_67AC
    546. loc_6787: stc
    547.     retn
    548. loc_6789: push bx
    549.     push ax
    550.     lds si,ss:3Ch
    551.     mov bl,47h ; 'G'
    552.     mul bl
    553.     add si,ax
    554.     pop ax
    555.     pop bx
    556.     test word ptr [si+43h],800h
    557.     jz loc_67AC
    558.     push ax
    559. db 0C4h,0C4h ; -
    560.     push sp
    561.     add al,58h ; 'X'
    562.     jb loc_6787
    563.     and word ptr [si+43h],0F7FFh
    564. loc_67AC: mov ss:5A4h,si
    565.     mov ss:5A6h,ds
    566.     clc
    567.     retn
    568.  
    569. sub_681A proc
    570.     xor al,al
    571.     jmp short loc_6820
    572. sub_681A endp
    573. sub_681E proc
    574.     mov al,0FFh
    575. loc_6820:: mov ss:34Eh,al
    576.     mov al,0FFh
    577.     mov ss:574h,al
    578.     mov byte ptr ss:57Dh,0FFh
    579.     mov ss:5B4h,di
    580.     mov word ptr ss:5B8h,0FFFFh
    581.     push ss
    582.     pop es
    583.     lea bp,[di+86h]
    584.     call sub_6ADB
    585.     push ax
    586.     mov ax,[si]
    587.     call sub_4F79
    588.     xchg ah,al
    589.     call sub_4F79
    590.     jnz loc_6868
    591.     cmp ah,al
    592.     jnz loc_6868
    593.     pop ax
    594.     movsw
    595. loc_6858: lodsb
    596.     call sub_4F24
    597.     or al,al
    598.     jz loc_6863
    599.     stosb
    600.     jmp short loc_6858
    601. loc_6863: stosb
    602.     mov ax,0FFFFh
    603.     retn
    604. loc_6868: pop ax
    605.     cmp byte ptr [si],0
    606.     jnz loc_6872
    607.     mov al,2;файл не найден
    608.     stc
    609.     retn
    610. loc_6872: push ax
    611.     push bp
    612.     call loc_4B13
    613.     pop bp
    614.     pop ax
    615.     jnb loc_68A2
    616.     or dx,dx
    617.     jz loc_6883
    618. loc_687F: mov al,3;путь не найден
    619.     stc
    620.     retn
    621. loc_6883: mov byte ptr ss:575h,0FFh
    622.     call sub_66D7
    623.     mov byte ptr ss:575h,0
    624.     jb loc_687F
    625.     call sub_6AF2
    626.     mov al,'/'
    627.     stosb
    628. @@: lodsb
    629.     call sub_4F24
    630.     call sub_4F79
    631.     stosb
    632.     or al,al
    633.     jnz @b
    634.     xor ax,ax
    635.     push ss
    636.     pop ds
    637. locret_68A1: retn
    638. loc_68A2: call sub_66BA
    639.     mov al,3
    640.     jb locret_68A1
    641.     push ds
    642.     push si
    643.     lds si,ss:5A4h
    644.     mov bx,di
    645.     add bx,[si+45h]
    646.     lea bp,[di+86h]
    647.     call sub_3401
    648.     dec di
    649.     mov al,'\'
    650.     cmp es:[di-1],al
    651.     jz loc_68C6
    652.     stosb
    653. loc_68C6: dec di
    654.     pop si
    655.     pop ds
    656.     call sub_6991
    657.     jnz loc_68DF
    658.     or al,al
    659.     jz loc_68E2
    660.     mov di,bx
    661. loc_68D4: lodsb
    662.     call sub_4F79
    663.     jz loc_68D4
    664.     dec si
    665.     or al,al
    666.     jz loc_68E2
    667. loc_68DF: mov al,'\'
    668.     stosb
    669. loc_68E2: call sub_6923
    670.     jb locret_68A1
    671.     push ss
    672.     pop ds
    673.     mov di,ds:5B4h
    674.     lds si,ds:5A4h
    675.     call sub_6AFA
    676.     jnz loc_690A
    677.     mov al,[si-1]
    678.     call sub_4F79
    679.     jz loc_690A
    680.     cmp byte ptr es:[di],0
    681.     jz loc_690A
    682.     inc di
    683.     mov ss:5B8h,di
    684. loc_690A: push ss
    685.     pop ds
    686.     mov si,ds:5B4h
    687.     xor cx,cx
    688.     test byte ptr ds:574h,0FFh
    689.     jz loc_691C
    690.     call sub_6A3C
    691. loc_691C: push ss
    692.     pop ds
    693.     mov ax,0FFFFh
    694.     clc
    695.     retn
    696. sub_681E endp
    697. sub_6923 proc
    698.     lodsb
    699.     call sub_4F79
    700.     jnz loc_6930
    701.     cmp di,bp
    702.     jnb loc_694F
    703.     stosb
    704.     jmp short sub_6923
    705. loc_6930: dec si
    706. loc_6931: xor ax,ax
    707.     cmp [si],al
    708.     jnz loc_695A
    709.     cmp byte ptr es:[di-1],':'
    710.     jz loc_6947
    711.     cmp byte ptr es:[di-1],'\'
    712.     jnz loc_694C
    713.     jmp short loc_694F
    714. loc_6947: mov al,'\'
    715.     stosb
    716.     mov al,ah
    717. loc_694C: stosb
    718.     clc
    719.     retn
    720. loc_694F: call sub_6B13
    721.     mov al,3;путь не найден
    722.     jz loc_6958
    723.     mov al,2;файл не найден
    724. loc_6958: stc
    725. locret_6959: retn
    726. loc_695A: call sub_69AE
    727.     jb locret_6959
    728.     cmp word ptr es:[di],'.'
    729.     jz loc_696D
    730.     cmp word ptr es:[di],'..'
    731.     jnz loc_6976
    732.     dec di
    733. loc_696D: call sub_699B
    734.     mov al,3
    735.     jb locret_6959
    736.     jmp short loc_6978
    737. loc_6976: add di,cx
    738. loc_6978: call sub_6991
    739.     jnz loc_694F
    740.     lodsb
    741.     call sub_4F79
    742.     jnz loc_6930
    743.     cmp di,bp
    744.     jnb loc_694F
    745.     stosb
    746. loc_6988: lodsb
    747.     call sub_4F79
    748.     jz loc_6988
    749.     dec si
    750.     jmp short loc_6931
    751. sub_6923 endp
    752.  
    753. sub_6991 proc
    754.     mov al,[si]
    755. sub_6993:: or al,al
    756.     jz @f
    757.     call sub_4F79
    758. @@: retn
    759. sub_6991 endp
    760. sub_699B proc
    761.     cmp di,bx
    762.     jb loc_69AA
    763.     dec di
    764.     mov al,es:[di]
    765.     call sub_4F79
    766.     jnz sub_699B
    767.     clc
    768.     retn
    769. loc_69AA: mov al,3;путь не найден
    770.     stc
    771.     retn
    772. sub_699B endp
    773. sub_69AE proc
    774.     sub sp,0Eh
    775.     push ds
    776.     push si
    777.     push es
    778.     push di
    779.     push bp
    780.     mov bp,sp
    781.     mov ah,'.'
    782.     movsb
    783.     cmp [si-1],ah
    784.     jnz loc_69D8
    785.     call sub_6991
    786.     jz loc_69D0
    787.     movsb
    788.     cmp [si-1],ah
    789.     jnz loc_6A22
    790.     call sub_6991
    791.     jnz loc_6A22
    792. loc_69D0: xor al,al
    793.     stosb
    794.     mov [bp+6],si
    795.     jmp short loc_6A1F
    796. loc_69D8: mov si,[bp+6]
    797.     call sub_4EB7
    798.     cmp si,[bp+6]
    799.     jz loc_6A22
    800.     test byte ptr ss:575h,0FFh
    801.     jnz loc_69FB
    802.     and dl,1
    803.     add ss:57Dh,dl
    804.     jg loc_6A22
    805.     jnz loc_69FB
    806.     or dl,dl
    807.     jz loc_6A2A
    808. loc_69FB: mov [bp+6],si
    809.     push ss
    810.     pop ds
    811.     mov si,54Eh
    812.     lea di,[bp+0Ah]
    813.     push di
    814.     movsd;копирую 8 байт (имя файла)
    815.     movsd
    816. @@: cmp byte ptr es:[di-1],' '
    817.     jnz @f
    818.     dec di
    819.     inc cx
    820.     cmp cx,8
    821.     jb @b
    822. @@: cmp word ptr [si],' '
    823.     jnz @f
    824.     cmp byte ptr [si+2],' '
    825.     jz loc_4232
    826. @@: mov al,'.'
    827.     stosb
    828.     movsw;копирую 3 байта (расширение файла)
    829.     movsb
    830. @@: cmp byte ptr es:[di-1],' '
    831.     jnz loc_4232
    832.     dec di
    833.     jmp @b
    834. loc_4232: xor ax,ax
    835.     stosb
    836.     pop di
    837.     call sub_340A;в CX длина строки на которую указывает DI
    838.     dec cx
    839.     add cx,[bp+2]
    840.     cmp cx,[bp+0]
    841.     jnb loc_6A22
    842.     mov si,di
    843.     les di,[bp+2]
    844.     call sub_3401
    845. loc_6A1F: clc
    846.     jmp short loc_6A2D
    847. loc_6A22: stc
    848.     call sub_6B13
    849.     mov al,2
    850.     jnz loc_6A2D
    851. loc_6A2A: stc
    852.     mov al,3;путь не найден
    853. loc_6A2D: pop bp
    854.     pop di
    855.     pop es
    856.     pop si
    857.     pop ds
    858.     lahf
    859.     add sp,0Eh
    860.     call sub_340A;в CX длина строки на которую указывает DI
    861.     dec cx
    862.     sahf
    863.     retn
    864. sub_69AE endp
    865. sub_6A3C proc
    866.     test byte ptr ss:5Ah,0FFh
    867.     jz loc_6AAE
    868.     push word ptr ss:5A4h
    869.     push word ptr ss:5A6h
    870.     push ds
    871.     push si
    872.     pop di
    873.     pop es
    874.     xor ax,ax
    875. @@: call loc_672E
    876.     jb loc_6AA4
    877.     inc al
    878.     test word ptr [si+43h],2000h
    879.     jz @b
    880.     push di
    881.     call sub_6AFA
    882.     jz loc_6A6B
    883. loc_6A68: pop di
    884.     jmp short @b
    885. loc_6A6B: cmp byte ptr es:[di],0
    886.     jnz loc_6A79
    887.     test byte ptr ss:34Eh,0FFh
    888.     jnz loc_6A68
    889. loc_6A79: mov si,di
    890.     push es
    891.     pop ds
    892.     pop di
    893.     call sub_6AF4
    894.     mov ax,ss:[5B8h]
    895.     or ax,ax
    896.     js loc_6A91
    897.     add ax,di
    898.     sub ax,si
    899.     mov ss:[5B8h],ax
    900. loc_6A91: cmp byte ptr [si],0
    901.     jnz @f
    902.     mov al,'\'
    903.     stosb
    904. @@: call sub_3401
    905.     add sp,4
    906.     or cl,1
    907.     jmp short loc_6AB0
    908. loc_6AA4: pop word ptr ss:5A6h
    909.  pop word ptr ss:5A4h
    910. loc_6AAE: xor cx,cx
    911. loc_6AB0: lds si,ss:5A4h
    912. locret_6AB5: retn
    913. sub_6A3C endp
    914.  
    915. sub_6ADB proc
    916.     xor al,al
    917.     cmp byte ptr [si],0
    918.     jz @f
    919.     cmp byte ptr [si+1],':'
    920.     jnz @f
    921.     lodsw
    922.     or al,20h
    923.     sub al,60h ; '`'
    924.     jnz @f
    925.     mov al,0FFh
    926. @@: retn
    927. sub_6ADB endp
    928.  
    929. sub_6AF2 proc
    930.     inc al
    931. sub_6AF4:: add al,40h ; '@'
    932.     mov ah,3Ah ; ':'
    933.     stosw
    934.     retn
    935. sub_6AF2 endp
    936.  
    937. sub_6AFA proc
    938.     push bx;в CX длина строки на которую указывает SI
    939.     xor bx,bx
    940. @@: cmp byte ptr [si+bx],0
    941.     jz @f
    942.     inc bx
    943.     jmp @b
    944. @@: lea cx,[bx-1]; cx := bx - 1
    945.     pop bx
    946.     repe cmpsb
    947.     jnz a1
    948.     push ax
    949.     mov al,[si-1]
    950.     call sub_4F79
    951.     jz @f
    952.     mov al,es:[di]
    953.     call sub_6993
    954. @@: pop ax
    955. a1: retn
    956. sub_6AFA endp
    957.  
    958. sub_6B13 proc
    959.     lodsb
    960.     call sub_6993
    961.     jnz sub_6B13
    962.     call sub_4F79
    963.     retn
    964. sub_6B13 endp
    965.  
    966.  
    967. sub_6CA9: ;proc
    968.     push cx
    969.     mov cx,4652h
    970.     mov byte ptr ss:570h,6
    971. loc_6B28: call sub_617B
    972.     jb loc_6C90
    973.     mov word ptr es:[di+5],0
    974.     mov ss:5ACh,bx
    975.     mov ss:5A0h,di
    976.     mov ss:5A2h,es
    977.     call sub_6168
    978. ;   jnb loc_6B4A
    979. ;loc_6B47: jmp loc_6C90
    980. loc_6B4A: mov ss:5B0h,di
    981.     mov ss:5B2h,es
    982.     mov ss:5AEh,bx
    983.     mov bx,ss:5ACh
    984.     mov es:[di],bl
    985.     mov si,offset filename
    986.     mov di,3D2h
    987.     push cx
    988.     call sub_681A
    989.     mov dx,ax
    990.     pop bx
    991.     lds si,ss:5A0h
    992.     jb loc_6C81
    993.     cmp byte ptr ss:57Dh,0FFh
    994.     jnz loc_6C81
    995. loc_6B81: pop ax
    996.     xor cx,cx
    997.     mov [si+2],cx
    998.     cmp bx,45DFh
    999.     jnz loc_6B96
    1000.     test al,80h
    1001.     jz loc_6B96
    1002.     and al,7Fh
    1003.     mov cx,1000h
    1004. loc_6B96: push di
    1005.     push es
    1006.     push ds
    1007.     pop es
    1008.     push si
    1009.     pop di
    1010.     call sub_6FB1
    1011.     pop es
    1012.     pop di
    1013.     push ss
    1014.     pop ds
    1015.     or dx,dx
    1016.     jnz loc_6BAA
    1017. loc_6BAA: push bx
    1018.     push cx
    1019.     push dx
    1020.     mov si,ds:5B4h
    1021.     push bp
    1022.     xor dx,dx
    1023.     mov cx,ax
    1024. db 0C4h,0C4h;les ax,sp
    1025.     push ax
    1026.     add si,[bp+di+3]
    1027.     call loc_51F0
    1028.     mov di,bp
    1029.     pop bp
    1030.     lds si,ds:5A0h
    1031.     jb loc_6C38
    1032.     mov [si+1Dh],di
    1033.     mov [si+1Fh],ax
    1034.     mov dword ptr [si+13h],0
    1035.     mov [si+0Fh],cx
    1036.     mov [si+11h],bx
    1037.     or dx,dx
    1038.     jz @f
    1039.     or word ptr [si+5],2000h
    1040. @@: pop dx
    1041.     pop cx
    1042.     pop bx
    1043.     push ds
    1044.     push ss
    1045.     pop ds
    1046.     mov di,ds:[5B4h]
    1047.     cmp byte ptr [di],'A'
    1048.     jb loc_6C2F
    1049.     cmp byte ptr [di],'Z'
    1050.     ja loc_6C2F
    1051.     mov al,[di]
    1052.     sub al,'A'
    1053.     xor ah,ah
    1054.     pop ds
    1055.     or [si+5],ax
    1056.     jmp short @f
    1057. loc_6C2F: pop ds
    1058. @@: and word ptr [si+5],0FD7Fh
    1059.     mov word ptr [si],1
    1060.     or [si+5],cx
    1061.     mov ax,ss:5AEh
    1062.     mov word ptr ss:5ACh,0FFFFh
    1063.     call sub_2742
    1064.     and word ptr [si+16h],0FFFEh
    1065.     jmp loc_2826
    1066. loc_6C90: sti
    1067.     pop cx
    1068. loc_6C94: mov word ptr ss:[5ACh],0FFFFh
    1069.     cmp word ptr ss:[326h],25h ; '%'
    1070.     jz a2
    1071.     xor ah,ah
    1072.     push si
    1073.     push ds
    1074.     push cx
    1075.     push bx
    1076.     push ss
    1077.     pop ds
    1078.     mov ds:[326h],ax
    1079.     mov si,225Bh
    1080.     mov bh,al
    1081.     mov bl,ds:[33Dh]
    1082. @@: lods word ptr cs:[si]
    1083.     cmp al,0FFh
    1084.     jz loc_28AB
    1085.     cmp al,bl
    1086.     jz loc_28AF
    1087.     shr ax,8
    1088.     add si,ax
    1089.     jmp @b
    1090. loc_28AB: mov al,bh
    1091.     jmp short loc_28BB
    1092. loc_28AF: mov cl,ah
    1093.     xor ch,ch
    1094. @@: lods byte ptr cs:[si]
    1095.     cmp al,bh
    1096.     jz loc_28BB
    1097.     loop @b
    1098. loc_28BB: xor ah,ah
    1099.     pop bx
    1100.     pop cx
    1101.     pop ds
    1102.     mov si,0DDBh
    1103.     cmp byte ptr ss:[34Ch],0
    1104.     jz @f
    1105.     mov word ptr ss:[326h],53h ; 'S'
    1106. @@: push ds
    1107.     push ax
    1108.     push bx
    1109.     mov ds,cs:[new_DS]
    1110.     mov bx,ds:[326h]
    1111. @@: lodsb
    1112.     cmp al,0FFh
    1113.     jz @f
    1114.     cmp al,bl
    1115.     jz @f
    1116.     add si,3
    1117.     jmp short @b
    1118. @@: lodsw
    1119.     cmp ah,0FFh
    1120.     jz @f
    1121.     mov ds:328h,ah
    1122. @@: cmp al,0FFh
    1123.     jz @f
    1124.     mov ds:329h,al
    1125. @@: lodsb
    1126.     cmp al,0FFh
    1127.     jz @f
    1128.     mov ds:325h,al
    1129. @@: pop bx
    1130.     pop ax
    1131.     pop ds
    1132.     pop si
    1133. a2: call sub_2742
    1134.     or word ptr [si+16h],1
    1135.     stc
    1136. loc_2826: mov [si],ax
    1137.     retn
    1138.  
    1139. loc_6C38: pop dx
    1140.     pop cx
    1141. loc_6C81: pop bx
    1142.     mov word ptr [si],0
    1143.     lds si,ss:5B0h
    1144.     mov byte ptr [si],0FFh
    1145.     jmp loc_6C94
    1146.  
    1147. sub_6FB1 proc
    1148.     test byte ptr ss:5F8h,1
    1149.     jz @f
    1150.     push ax
    1151.     mov ax,ss:603h
    1152.     or es:[di+2],ax
    1153.     pop ax
    1154.     stc
    1155. @@: retn
    1156. sub_6FB1 endp
    1157. ;---------------------------------------
    1158. filename db 'myfile.txt',0
    1159. new_DS dw 0A7h
    1160. table_0B33:
    1161. db 0Ah, 0E8h, 5Eh, 45h, 0B0h, 82h, 0FEh, 0C4h, 0E8h, 57h, 45h
    1162. db 0FEh, 0C4h, 0E8h, 3Bh, 45h, 0FEh, 0C4h, 0E8h, 36h, 45h, 0C3h
    1163. db 60h, 0B4h, 0Ah, 0B3h, 0, 0B7h, 80h, 0B9h, 58h, 0, 9Ch, 0FAh
    1164. db 0E8h, 14h, 9, 74h, 4, 9Dh, 0F9h, 0EBh, 2, 9Dh, 0F8h, 61h, 0C3h
    1165. db 3 dup(0), 10h, 3 dup(3 dup(0),1,2 dup(0),10h), 3 dup(0), 1
    1166. db 7 dup(0), 80h, 96h, 98h, 0, 40h, 42h, 0Fh, 0, 0A0h, 86h, 1
    1167. db 0, 10h, 27h, 2 dup(0), 0E8h, 3, 2 dup(0), 64h, 3 dup(0), 0Ah
    1168. db 3 dup(0), 1, 7 dup(0), 3 dup (19h, 0F9h), 4, 0F1h, 4Eh
    1169.  
    1170. end start
     
    Последнее редактирование: 24 ноя 2019