Знаю, что БАЯН, но вдруг кому-то пригодится 1) Код (ASM): ; masm dos com # .model tiny .286 .CODE org 100h start: mov ah,3Ch mov cx,0; атрибуты файла mov dx,offset filename int 21h retn filename db 'myfile.txt',0 end start 2) Код (ASM): ; masm dos com # .286 .model tiny .code org 100h start: mov ah,5Bh mov cx,0; атрибуты файла mov dx,offset filename int 21h retn filename db 'myfile.txt',0 end start 3) Код (ASM): ; masm dos com # .286 .model tiny .code org 100h start: mov cx,0; атрибуты файла - обычный файл mov bx,2 ;режим доступа чтение-запись mov dx,10h mov si,offset filename;указатель на имя файла mov ah,6Ch int 21h ;создаем файл retn filename db 'myfile.txt',0 end start 4) создаем файл с длинным именем (до 255 символов) и чуствительным к регистру Код (ASM): ; masm dos com # .286 .model tiny .code org 100h start: mov cx,0; атрибуты файла - обычный файл mov bx,2 ;режим доступа чтение-запись mov dx,10h mov si,offset filename;указатель на имя файла mov ax,716Ch int 21h retn filename db 'myfile.txt',0 end start 5) через FCB Код (ASM): ; masm dos com # .286 .model tiny .code org 100h FCB struct drive_num db ? file_name db 8 dup(20h) file_ext db 3 dup(20h) block_num dw ? record_size dw ? file_size dd ? file_data dw ? rezerved db 10 dup(?) current_rec db ? random_rec dd ? FCB ends start: mov ah,16h mov dx,offset fcb int 21h ret fcb FCB <0,'myfile','txt'> ;0 - диск по умолчанию, далее 8-байтовое имя файла ;если меньше, то заполняется пробелами, далее 3-байтовое расширение end start 6) создаем файл при помощи набора команд DOS Код (ASM): ; masm dos com # .286 .model tiny .code org 100h start: mov bx,100h ;выделим блок памяти в 256 параграфов mov ah,4Ah int 21h mov bx,offset parametrs ;указываем на блок параметров mov [bx+4],cs mov dx,offset filename mov ax,4B00h;загрузить и выполнить программу из командной строки int 21h retn ;выход в DOS command_line db N,'/c copy nul myfile.txt',0Dh N = $-command_line-1;длина командной строки ;командная строка типа pascal, начинается с байта длины строки, заканчивается ;ASCII-кодом клавиши Enter (0Dh). При передаче команды CMD.EXE нужно указать /С перед ;строкой (требование вызова вторичного командного процессора). Программу cmd.exe ;из папки windows\system32\ проще разместить в том же каталоге, что и программа filename db 'cmd.exe',0 parametrs dw 0,command_line,5 dup(0);блок параметров end start 7) Загрузить COMMAND.COM и настроить его по месту в памяти не используя функцию 4Bh прерывания 21h Код (ASM): ; masm dos com # .286 .model tiny .code org 100h start: mov ah,4Ah ;модифицируем назначенную память mov bx,100h ;новый размер блока в параграфах int 21h or bx,-1 ;требуемое число параметров для выполнения mov ah,48h ;вделить блок памяти int 21h ;возвращает в bx размер наибольшего доступного блока ;памяти в параграфах mov ah,48h ;вделить блок памяти, в bx действительно доступная память int 21h ;возвращает в ах сегментный адрес выделенного блока mov es,ax ;es:=new PSP mov ss,ax ;ss:=new PSP xchg dx,ax ;dx:=new PSP mov ah,26h ;создать новый префикс программного сегмента int 21h mov dx,offset filename mov di,80h ;указатель на командную строку mov cx,(N+1)/2 ;копируем по два байта за раз, N округлен в большую ;сторону к числу кратному два, поэтому добавочный movsb не нужен mov si,offset command_line rep movsw ;создаем командную строку для запуска command.com mov ax,3D00h ;открыть command.com на чтение int 21h xchg bx,ax ;дескриптор файла в bx xor cx,cx ;cx=dx=0 xor dx,dx mov ax,4202h ;установить файловый указатель на конец файла int 21h push ax ;сохраним в стеке длину файла command.com mov ax,4200h ;установить файловый указатель на начало файла int 21h mov dx,es ;пересчитываем чему должен быть равен dx из расчета, add dx,10h ;что cs*10h+dx=es*10h+100h mov cx,cs sub dx,cx shl dx,4 ;в dx адрес буфера, куда будет скопирован command.com pop cx ;в сх число байтов для чтения mov ah,3Fh ;читаем command.com в буфер int 21h mov ah,3Eh ;закрыть файл command.com int 21h mov ax,es ;ds:=new PSP mov ds,ax ;при старте СОМ-файла cs=ds=es=ss=PSP ip=100h push es ;новое значение cs:=new PSP push 100h ;новое значение ip:=100h retf ;запускаем command.com для создания файла myfile.txt filename db 'c:\windows\system32\command.com',0;полный путь к command.com command_line db N-1,'/c copy > myfile.txt',0Dh N = $ - command_line db 0; если N нечетное, то скопируется и добавочный нулевой символ end start 8) имитируем вызов int 21h Код (ASM): ; masm dos com # .286 .model tiny .code org 100h start: ;получаем дальний адрес (cs:ip) обработчика ;прерывания 21h из таблицы векторов прерывания push 0;сегментный адрес таблицы векторов прерывания в es pop es mov di,es:[21h*4];смещение обработчика прерывания 21h в di mov si,es:[21h*4+2];сегмент обработчика прерывания 21h в si ;параметры для функции 3Ch прерывания 21h mov cx,0 ;аттрибуты файла (обычный файл) mov dx,offset filename;имя создаваемого файла mov ah,3Ch ;номер функции ;три параметра в стек для возврата из прерывания pushf push cs push offset @f ;адрес возврата ;имитируем вызов int 21h push si ;cs для int 21h push di ;ip для int 21h retf ;подменяем cs и ip @@: mov ah,4Ch ;выход из программы int 21h filename db 'myfile.txt',0 end start 9) Код (ASM): ; masm dos com # .286 .model tiny .code org 100h FCB struct drive_num db ? file_name db 8 dup(20h) file_ext db 3 dup(20h) block_num dw ? record_size dw ? file_size dd ? file_data dw ? rezerved db 10 dup(?) current_rec db ? random_rec dd ? FCB ends start: push offset @f ; Занести в стек флаги, сегмент push cs ; и смещение адреса возврата pushf ; в обратном порядке. mov cl,16h mov dx,offset fcb jmp dword ptr ALT_DOS_PTR ; Выполнить функцию. @@: mov ah,4Ch int 21h fcb FCB <0,'myfile','txt'> ;0 - диск по умолчанию, далее 8-байтовое имя файла ;если меньше, то заполняется пробелами, далее 3-байтовое расширение ALT_DOS_PTR dw 0C0h,0;адрес для перехода в альтернативный обработчик end start
ну тогда надо еще низкоуровневый. Без ДОС (через int 13). Чтение FAT, запись имени файла, указание размера, связывание его с одним из кластеров или секторов. (самый-самый низкоуровневый через порты не предлагаю - это уже для джедаев) Зы: когда то была классная шутка/защита от копирования дискет - на дискете помечаешь размер файла в 4Гб, и все попытки ее скопировать идут лесом... Ни средствами ДОС, ни в винде, ни создание образа дискеты не помогут.
Дискеты щас не модно. Сейчас надо ячейки на дешевых флешках небольшой емкости выжигать, как раньше дырки на дискетах кололи
А я давно хотел память на феррите запилить. Чисто ради интереса, сотню ферритовых колец и не много логики отечественной. К стати раздобыл немного литров ртути, можно на ней тоже сделать. Но стрёмно, она токсичная.
Mikl___ приведите для всех Ваших примеров полный комплект действий с файлом: открытие файла, запись в файл, закрытие файла. В противном случае юные асмитсты не смогут увидеть прелестей DOS-программ. Для первого варианта: открытие файла - Вы показали, но я бы добавил Код (ASM): ..... int 21h mov handle, ax; запись в файл - Код (ASM): mov ah,40h mov bx,handle mov cx,4 ; длинна записи в байтах mov dx,offset x: х - записываемая переменная int 21h; закрытие файла - Код (ASM): mov ah,3eh mov bx, handle int 21h Прошу простить, если я опередил Ваши мысли и Вы собирались эту информацию поместить позже!
В догонку: при записи переменной х в СХ записано 4, так как переменная х определена размером DD - четыре байта х dd ?
10) Перечитывая Зубкова наткнулся на еще один способ Код (ASM): ; masm dos com # .286 .model tiny .code org 100h start: mov si,offset string mov cx,N @@: push cx lodsb mov ah,5 ;номер функции mov cl,al;передача параметра через регистр CL, содержимое CH=0 int 16h pop cx loop @b retn string db 'copy>myfile.tx',0Dh; не более 15 символов N = $ - string end start Там в главе "Основы программирования для MS-DOS" 4.4.2 Ввод с клавиатуры. Средства BIOS. Пример, который имитирует набор на клавиатуре команды DIR, через 5 функцию 16h прерывания. Но стоит примечание У меня под FAR'ом программа работала, но попытка создать файл через "COPY > myfile.txt" не работала, пока опытным путем я не установил, что длина всей строки не должна быть больше 15 символов, обязательно заканчиваться на 0Dh (ASCII-код Enter) 11) через int 2Eh Код (ASM): ; masm dos com # .286 .model tiny .code org 100h start: mov ah,4Ah ;allow mem alloc. mov bx,10h ;новый размер блока в параграфах int 21h mov si,offset command_line int 2Eh ; execute a command using BASE LEVEL mov ah,4Ch ;выходим из программы int 21h command_line db N,'copy > myfile.txt',0Dh N = $ - command_line - 1 end start MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА На самом деле символ 0Dh можно как включать в длину строки, так и не включать в неё — и в том и в другом случае программа работает. По всей видимости int 2Eh используется в Волков Коммандере (VC.COM), по крайней мере, у Всеволода В. Волкова в book.lib.rus.ec/books/VCINFO.TXT я нашел такую фразу 12) Код (ASM): ; masm dos com # .286 .model tiny .code org 100h start: xor cx,cx; атрибуты файла mov es,cx les bx,es:[4*21h];читаем адрес текущего обработчика int 21h mov ofs21,bx mov seg21,es mov ah,3Ch mov dx,offset filename pushf; вызываем прерывание 21h db 9Ah;дальний вызов процедуры с указанием непосредственного адреса ofs21 dw ? seg21 dw ? retn filename db 'myfile.txt',0 end start 13) Код (ASM): ; masm dos com # .286 .model tiny .code org 100h start: xor cx,cx; атрибуты файла push ds mov ds,cx mov si,4*21h;читаем адрес текущего обработчика int 21h mov di,offset ofs21 movsw movsw pop ds mov ah,3Ch mov dx,offset filename pushf call dword ptr ofs21; вызываем прерывание 21h retn filename db 'myfile.txt',0 ofs21 dd ? end start
Выдираю из io.sys (можно из ntvdm) кусок 21h прерывания, отвечающего за создание файла. Во вложении сорц и СОМ-файл создающий файл на диске и не использующий прерывания. Строго не судите Код (ASM): ; masm dos com # ;.286 .model tiny .code .386 org 100h start: mov cx,0;аттрибуты файла pushf;три параметра для iret push cs push return cli;вход в прерывание 21h push es push ds pusha mov ax,ds mov ds,cs:new_DS ; 0A7 mov ds:[5EEh],ax;old DS mov ds:[5ECh],bx; сохранили BX mov ax,ds:[586h] mov ds:[5F4h],ax mov ax,ds:[588h] mov ds:[5F2h],ax mov byte ptr ds:[575h],0 test byte ptr ds:[100Eh],1 jnz @f mov word ptr ds:[340h],0;ax @@: inc byte ptr ds:[323h] mov ds:[586h],sp mov ds:[588h],ss mov ax,ds:[332h];0F53h mov ds:[33Eh],ax mov ds,ax mov ds:[2Eh],sp mov ds:[30h],ss mov ss,cs:new_DS mov sp,7A2h sti mov ds,cs:new_DS mov byte ptr ss:[5F8h],0 and word ptr ss:[613h],800h mov word ptr ss:[359h],100h mov byte ptr ss:[34Eh],0 mov byte ptr ss:[34Ch],0 mov word ptr ss:[33Ch],3C00h;аргумент "создать файл" mov byte ptr ss:[322h],0 mov word ptr ss:[324h],01FFh mov byte ptr ss:[35Ah],0 mov sp,922h mov bx,6CA9h xchg bx,ss:[5ECh] mov ds,ss:[5EEh] call sub_6CA9 and byte ptr ss:[86h],0FBh cli mov ds,cs:new_DS dec byte ptr ds:[323h] lss sp,ds:[586h] mov bp,sp mov [bp],al mov ax,ds:[5F4h] mov ds:[586h],ax mov ax,ds:[5F2h] mov ds:[588h],ax popa ;выход из прерывания 21h pop ds pop es push ds mov ds,cs:[new_DS] test byte ptr ds:[1482h],2 pop ds jmp loc_5424 sub_2742 proc ;из 2 мест mov ds,cs:[new_DS] lds si,ds:[586h] retn sub_2742 endp sub_3401 proc; копируем строку (вызов из трех мест) @@: movsb cmp byte ptr [si-1],0 jnz @b retn sub_3401 endp sub_340A proc ;в CX длина строки на которую указывает DI push di ;(вызов из двух мест) push ax mov cx,0FFFFh xor al,al repne scasb not cx pop ax pop di retn sub_340A endp loc_4B13: mov dx,ax push di push si mov di,si loc_4B19: lodsb or al,al jz loc_4B27 call sub_4F79 jnz loc_4B19 mov di,si jmp short loc_4B19 loc_4B27: mov si,di push ds push si push dx call sub_4EB7 pop dx cmp byte ptr [si],0 stc jnz loc_4B3D push ss pop ds push dx push si push di push cx push ax push word ptr ds:[54Eh] cmp byte ptr ds:[54Eh],5 jnz @f mov byte ptr ds:[54Eh],0E5h ; 'х' @@: test byte ptr ds:[56Eh],8 jnz @f mov si,48h ; 'H' loc_4AA4: test word ptr [si+4],8000h jz loc_4ABC mov ax,si add si,0Ah mov di,54Eh mov cx,4 repe cmpsw mov si,ax jnz loc_4ABC;D1 mov ss:59Eh,ds mov bh,[si+4] or bh,0C0h and bh,0DFh mov ss:[59Ch],si jmp a3 loc_4ABC: lds si,[si] cmp si,0FFFFh jnz loc_4AA4 @@: stc a3: mov cx,ss mov ds,cx pop word ptr ds:[54Eh] pop ax pop cx pop di pop si pop dx loc_4B3D: pop si pop ds pop di jb loc_4B6E cmp si,di jnz loc_4B4A xor dx,dx jmp short loc_4B70 loc_4B4A: mov al,[si] push ax mov byte ptr [si],0 push si mov si,di cmp dl,0 jnz near ptr unk_4B5D mov dl,ss:338h unk_4B5D db 0C4h,0C4h ; - push ax inc sp jnb loc_4B66 call loc_51F0 loc_4B66: pop si pop ax mov [si],al jnb loc_4B70 inc dx clc loc_4B6E: mov si,di loc_4B70: pop di cmc retn sub_4EB7 proc mov byte ptr ss:[350h],1 push ss pop es mov di,54Eh push di mov ax,2020h mov cx,5 stosb rep stosw xor al,al mov dl,al stosb pop di mov cx,8 call sub_4F23 jnbe loc_4E79 add di,cx jmp a6 loc_4E79: dec si loc_4E83:: call sub_4F23 jnz loc_4E94 test byte ptr ss:350h,0FFh jz loc_4EA9 cmp al,' ' jnz loc_4EA9 loc_4E94: jcxz loc_4E83 dec cx cmp al,'*' jnz loc_4E9F mov al,'?' rep stosb loc_4E9F: stosb cmp al,'?' jnz loc_4E83 or dl,1 jmp short loc_4E83 loc_4EA9: mov al,' ' rep stosb a6: dec si cmp byte ptr [si],'.' jnz loc_4E6F inc si test byte ptr ss:614h,1 jz loc_4E69 movsb mov cx,2 jmp short loc_4E6C loc_4E69: mov cx,3 loc_4E6C: call loc_4E83 loc_4E6F: mov al,dl and word ptr ss:613h,0FEFFh cmp byte ptr ss:54Eh,0E5h ; 'х' jnz @f mov byte ptr ss:54Eh,5 @@: retn sub_4EB7 endp table_4EE4: db 4 dup(66h),6,0Bh dup(66h),0F8h,0F6h,3 dup(0FFh) db 4Fh,0F4h,6Eh,5 dup(0FFh),44h,44h,0F4h,0Dh dup(0FFh) db 6Fh,66h,0Fh dup(0FFh),0F4h sub_4F23 proc ;вызов из двух мест lodsb sub_4F24:: push bx mov bx,offset table_0B33 cmp al,'a' jb loc_4F40 cmp al,'z' ja @f sub al,20h ;превращаем строчные латинские буквы в прописные @@: cmp al,80h ;максимальное значение jb loc_4F40 sub al,80h; в AL значения от 0 до 7Fh push ds mov ds,cs:[new_DS] xlat pop ds loc_4F40: push ax cmp al,7Eh ; '~' jb loc_4F76 mov al,0Fh jmp a7 loc_4F76: push bx mov bx,offset table_4EE4 shr al,1; в AL значения от 0 до 7Fh xlat byte ptr cs:[bx] pop bx jnb loc_4F73 shr al,4 loc_4F73: and al,0Fh a7: test al,1 pop ax pop bx retn sub_4F23 endp sub_4F79 proc ;вызов из 13 мест cmp al,'/' jbe loc_4F83 cmp al,'\' retn loc_4F80: mov al,'\' retn loc_4F83: jz loc_4F80 retn sub_4F79 endp loc_51F0: cmp byte ptr ss:12FCh,0 stc jnz loc_51FA retn loc_51FA: mov al,ss:12FDh push ax mov byte ptr ss:34Dh,18h call sub_521A cmp al,1 jz loc_5212 pop ax add ax,13h stc retn loc_5212: pop ax db 0C4h,0C4h ; - push ax xor si,[bp+si-29h] retn sub_521A proc xchg ax,di and di,0FFh xor ah,ah or ah,ss:[34Dh] mov al,ss:[12FEh] mov word ptr ss:[3B7h],0 cmp al,0FFh jnz loc_523F or ah,80h or word ptr ss:[3B7h],8000h loc_523F: mov ss:[584h],es mov ss:[582h],bp mov si,3B3h mov bp,ss sub_521A endp loc_5424: push ds push ax mov ax,40h mov ds,ax test word ptr ds:[314h],2400h jnz loc_5482 push bp mov bp,sp mov ax,[bp+0Ah] pop bp test ax, 100h jnz loc_5482 test ax,200h jz loc_5466 lock or word ptr ds:314h,200h test word ptr ds:314h,3 jz loc_5453 loc_5482: pop ax pop ds iret return: ret; завершаем программу loc_5466: lock and word ptr ds:314h, 0FDFFh loc_5453: xchg ah,al cld test al, 4 jz loc_545A std loc_545A: test al,8 jnz loc_546F jo loc_5479 loc_5460: sahf pop ax pop ds retf 2;выход по ошибке loc_546F: jo loc_5460 stc jmp short loc_5460 loc_5479: clc jmp short loc_5460 ;------------------------------------ sub_6168 proc xor bx,bx loc_616A: mov es,cs:[new_DS] mov es,es:332h cmp bx,es:32h jb @f mov al,6;недопустимый дескриптор stc retn @@: les di,es:[34h] add di,bx jb @f cmp byte ptr es:[di],0FFh jz locret_617A inc bx jmp short loc_616A @@: mov al,4;открыто слишком много файлов (нет свободных дескрипторов) locret_617A: retn sub_6168 endp sub_613D proc mov es,cs:[new_DS] ;cs:word_2257 les di,es:2Ah loc_6147: cmp bx,es:[di+4] jb loc_615B sub bx,es:[di+4] les di,es:[di] cmp di,0FFFFh jnz loc_6147 stc retn loc_615B: push ax mov ax,33 mul bl add di,ax pop ax add di,6 retn sub_613D endp sub_617B proc push ax xor bx,bx loc_617E: push bx call sub_613D pop bx jb loc_61AE cmp word ptr es:[di],0 jz loc_619E cmp word ptr es:[di],0FFFFh jz loc_6194 loc_6191: inc bx jmp short loc_617E loc_6194: mov ax,ss:33Eh cmp es:[di+1Bh],ax jnz loc_6191 loc_619E: mov word ptr es:[di],0FFFFh mov ax,ss:33Eh mov es:[di+1Bh],ax pop ax clc retn loc_61AE: pop ax mov al,4 retn sub_617B endp sub_6659 proc push ax les di,ss:5A4h mov word ptr es:[di+43h],0 cmp al,'Z' jna loc_6681 stc jmp short @f loc_6681: mov ah,':' mov es:[di],ax mov word ptr es:[di+2],'\' or byte ptr es:[di+44h],40h mov al,2 mov es:[di+45h],ax @@: pop ax retn sub_6659 endp sub_66BA proc call sub_66D7 jb @f push ds push si lds si,ss:5A4h test word ptr [si+43h],2000h pop si pop ds jz @f mov byte ptr ss:612h,0Fh stc @@: retn sub_66BA endp sub_66D7 proc or al,al jnz loc_66E0 mov al,ss:338h inc ax loc_66E0: dec ax push ds push si mov byte ptr ss:325h,2 test byte ptr ss:575h,0FFh jz loc_6712 push ax push es push di mov word ptr ss:5A4h,507h mov ss:5A6h,ss add al,'A' call sub_6659 test word ptr es:[di+43h],4000h pop di pop es pop ax jz loc_671E jmp short loc_672B loc_6712: call loc_672E jb loc_671E test word ptr [si+43h],4000h jnz loc_672B loc_671E: mov al,0Fh mov ss:612h,al mov byte ptr ss:325h,1 stc loc_672B: pop si pop ds retn sub_66D7 endp loc_672E: cmp byte ptr ss:13CDh,0 jz loc_6762 push bx push cx lds si,ss:3Ch mov cl,ss:47h xor ch,ch loc_6744: or word ptr [si+43h],800h mov bx,47h ; 'G' add si,bx loop loc_6744 pop cx pop bx mov byte ptr ss:13CDh,0 mov si,13F5h push ss pop ds or word ptr [si+43h],0C00h loc_6762: cmp al,ss:47h jb loc_6789 cmp al,19h ja loc_6787 mov si,13F5h push ss pop ds push ax db 0C4h,0C4h ; - push sp add al,58h ; 'X' jb loc_6787 mov word ptr [si+45h],2 mov word ptr [si+43h],4400h jmp short loc_67AC loc_6787: stc retn loc_6789: push bx push ax lds si,ss:3Ch mov bl,47h ; 'G' mul bl add si,ax pop ax pop bx test word ptr [si+43h],800h jz loc_67AC push ax db 0C4h,0C4h ; - push sp add al,58h ; 'X' jb loc_6787 and word ptr [si+43h],0F7FFh loc_67AC: mov ss:5A4h,si mov ss:5A6h,ds clc retn sub_681A proc xor al,al jmp short loc_6820 sub_681A endp sub_681E proc mov al,0FFh loc_6820:: mov ss:34Eh,al mov al,0FFh mov ss:574h,al mov byte ptr ss:57Dh,0FFh mov ss:5B4h,di mov word ptr ss:5B8h,0FFFFh push ss pop es lea bp,[di+86h] call sub_6ADB push ax mov ax,[si] call sub_4F79 xchg ah,al call sub_4F79 jnz loc_6868 cmp ah,al jnz loc_6868 pop ax movsw loc_6858: lodsb call sub_4F24 or al,al jz loc_6863 stosb jmp short loc_6858 loc_6863: stosb mov ax,0FFFFh retn loc_6868: pop ax cmp byte ptr [si],0 jnz loc_6872 mov al,2;файл не найден stc retn loc_6872: push ax push bp call loc_4B13 pop bp pop ax jnb loc_68A2 or dx,dx jz loc_6883 loc_687F: mov al,3;путь не найден stc retn loc_6883: mov byte ptr ss:575h,0FFh call sub_66D7 mov byte ptr ss:575h,0 jb loc_687F call sub_6AF2 mov al,'/' stosb @@: lodsb call sub_4F24 call sub_4F79 stosb or al,al jnz @b xor ax,ax push ss pop ds locret_68A1: retn loc_68A2: call sub_66BA mov al,3 jb locret_68A1 push ds push si lds si,ss:5A4h mov bx,di add bx,[si+45h] lea bp,[di+86h] call sub_3401 dec di mov al,'\' cmp es:[di-1],al jz loc_68C6 stosb loc_68C6: dec di pop si pop ds call sub_6991 jnz loc_68DF or al,al jz loc_68E2 mov di,bx loc_68D4: lodsb call sub_4F79 jz loc_68D4 dec si or al,al jz loc_68E2 loc_68DF: mov al,'\' stosb loc_68E2: call sub_6923 jb locret_68A1 push ss pop ds mov di,ds:5B4h lds si,ds:5A4h call sub_6AFA jnz loc_690A mov al,[si-1] call sub_4F79 jz loc_690A cmp byte ptr es:[di],0 jz loc_690A inc di mov ss:5B8h,di loc_690A: push ss pop ds mov si,ds:5B4h xor cx,cx test byte ptr ds:574h,0FFh jz loc_691C call sub_6A3C loc_691C: push ss pop ds mov ax,0FFFFh clc retn sub_681E endp sub_6923 proc lodsb call sub_4F79 jnz loc_6930 cmp di,bp jnb loc_694F stosb jmp short sub_6923 loc_6930: dec si loc_6931: xor ax,ax cmp [si],al jnz loc_695A cmp byte ptr es:[di-1],':' jz loc_6947 cmp byte ptr es:[di-1],'\' jnz loc_694C jmp short loc_694F loc_6947: mov al,'\' stosb mov al,ah loc_694C: stosb clc retn loc_694F: call sub_6B13 mov al,3;путь не найден jz loc_6958 mov al,2;файл не найден loc_6958: stc locret_6959: retn loc_695A: call sub_69AE jb locret_6959 cmp word ptr es:[di],'.' jz loc_696D cmp word ptr es:[di],'..' jnz loc_6976 dec di loc_696D: call sub_699B mov al,3 jb locret_6959 jmp short loc_6978 loc_6976: add di,cx loc_6978: call sub_6991 jnz loc_694F lodsb call sub_4F79 jnz loc_6930 cmp di,bp jnb loc_694F stosb loc_6988: lodsb call sub_4F79 jz loc_6988 dec si jmp short loc_6931 sub_6923 endp sub_6991 proc mov al,[si] sub_6993:: or al,al jz @f call sub_4F79 @@: retn sub_6991 endp sub_699B proc cmp di,bx jb loc_69AA dec di mov al,es:[di] call sub_4F79 jnz sub_699B clc retn loc_69AA: mov al,3;путь не найден stc retn sub_699B endp sub_69AE proc sub sp,0Eh push ds push si push es push di push bp mov bp,sp mov ah,'.' movsb cmp [si-1],ah jnz loc_69D8 call sub_6991 jz loc_69D0 movsb cmp [si-1],ah jnz loc_6A22 call sub_6991 jnz loc_6A22 loc_69D0: xor al,al stosb mov [bp+6],si jmp short loc_6A1F loc_69D8: mov si,[bp+6] call sub_4EB7 cmp si,[bp+6] jz loc_6A22 test byte ptr ss:575h,0FFh jnz loc_69FB and dl,1 add ss:57Dh,dl jg loc_6A22 jnz loc_69FB or dl,dl jz loc_6A2A loc_69FB: mov [bp+6],si push ss pop ds mov si,54Eh lea di,[bp+0Ah] push di movsd;копирую 8 байт (имя файла) movsd @@: cmp byte ptr es:[di-1],' ' jnz @f dec di inc cx cmp cx,8 jb @b @@: cmp word ptr [si],' ' jnz @f cmp byte ptr [si+2],' ' jz loc_4232 @@: mov al,'.' stosb movsw;копирую 3 байта (расширение файла) movsb @@: cmp byte ptr es:[di-1],' ' jnz loc_4232 dec di jmp @b loc_4232: xor ax,ax stosb pop di call sub_340A;в CX длина строки на которую указывает DI dec cx add cx,[bp+2] cmp cx,[bp+0] jnb loc_6A22 mov si,di les di,[bp+2] call sub_3401 loc_6A1F: clc jmp short loc_6A2D loc_6A22: stc call sub_6B13 mov al,2 jnz loc_6A2D loc_6A2A: stc mov al,3;путь не найден loc_6A2D: pop bp pop di pop es pop si pop ds lahf add sp,0Eh call sub_340A;в CX длина строки на которую указывает DI dec cx sahf retn sub_69AE endp sub_6A3C proc test byte ptr ss:5Ah,0FFh jz loc_6AAE push word ptr ss:5A4h push word ptr ss:5A6h push ds push si pop di pop es xor ax,ax @@: call loc_672E jb loc_6AA4 inc al test word ptr [si+43h],2000h jz @b push di call sub_6AFA jz loc_6A6B loc_6A68: pop di jmp short @b loc_6A6B: cmp byte ptr es:[di],0 jnz loc_6A79 test byte ptr ss:34Eh,0FFh jnz loc_6A68 loc_6A79: mov si,di push es pop ds pop di call sub_6AF4 mov ax,ss:[5B8h] or ax,ax js loc_6A91 add ax,di sub ax,si mov ss:[5B8h],ax loc_6A91: cmp byte ptr [si],0 jnz @f mov al,'\' stosb @@: call sub_3401 add sp,4 or cl,1 jmp short loc_6AB0 loc_6AA4: pop word ptr ss:5A6h pop word ptr ss:5A4h loc_6AAE: xor cx,cx loc_6AB0: lds si,ss:5A4h locret_6AB5: retn sub_6A3C endp sub_6ADB proc xor al,al cmp byte ptr [si],0 jz @f cmp byte ptr [si+1],':' jnz @f lodsw or al,20h sub al,60h ; '`' jnz @f mov al,0FFh @@: retn sub_6ADB endp sub_6AF2 proc inc al sub_6AF4:: add al,40h ; '@' mov ah,3Ah ; ':' stosw retn sub_6AF2 endp sub_6AFA proc push bx;в CX длина строки на которую указывает SI xor bx,bx @@: cmp byte ptr [si+bx],0 jz @f inc bx jmp @b @@: lea cx,[bx-1]; cx := bx - 1 pop bx repe cmpsb jnz a1 push ax mov al,[si-1] call sub_4F79 jz @f mov al,es:[di] call sub_6993 @@: pop ax a1: retn sub_6AFA endp sub_6B13 proc lodsb call sub_6993 jnz sub_6B13 call sub_4F79 retn sub_6B13 endp sub_6CA9: ;proc push cx mov cx,4652h mov byte ptr ss:570h,6 loc_6B28: call sub_617B jb loc_6C90 mov word ptr es:[di+5],0 mov ss:5ACh,bx mov ss:5A0h,di mov ss:5A2h,es call sub_6168 ; jnb loc_6B4A ;loc_6B47: jmp loc_6C90 loc_6B4A: mov ss:5B0h,di mov ss:5B2h,es mov ss:5AEh,bx mov bx,ss:5ACh mov es:[di],bl mov si,offset filename mov di,3D2h push cx call sub_681A mov dx,ax pop bx lds si,ss:5A0h jb loc_6C81 cmp byte ptr ss:57Dh,0FFh jnz loc_6C81 loc_6B81: pop ax xor cx,cx mov [si+2],cx cmp bx,45DFh jnz loc_6B96 test al,80h jz loc_6B96 and al,7Fh mov cx,1000h loc_6B96: push di push es push ds pop es push si pop di call sub_6FB1 pop es pop di push ss pop ds or dx,dx jnz loc_6BAA loc_6BAA: push bx push cx push dx mov si,ds:5B4h push bp xor dx,dx mov cx,ax db 0C4h,0C4h;les ax,sp push ax add si,[bp+di+3] call loc_51F0 mov di,bp pop bp lds si,ds:5A0h jb loc_6C38 mov [si+1Dh],di mov [si+1Fh],ax mov dword ptr [si+13h],0 mov [si+0Fh],cx mov [si+11h],bx or dx,dx jz @f or word ptr [si+5],2000h @@: pop dx pop cx pop bx push ds push ss pop ds mov di,ds:[5B4h] cmp byte ptr [di],'A' jb loc_6C2F cmp byte ptr [di],'Z' ja loc_6C2F mov al,[di] sub al,'A' xor ah,ah pop ds or [si+5],ax jmp short @f loc_6C2F: pop ds @@: and word ptr [si+5],0FD7Fh mov word ptr [si],1 or [si+5],cx mov ax,ss:5AEh mov word ptr ss:5ACh,0FFFFh call sub_2742 and word ptr [si+16h],0FFFEh jmp loc_2826 loc_6C90: sti pop cx loc_6C94: mov word ptr ss:[5ACh],0FFFFh cmp word ptr ss:[326h],25h ; '%' jz a2 xor ah,ah push si push ds push cx push bx push ss pop ds mov ds:[326h],ax mov si,225Bh mov bh,al mov bl,ds:[33Dh] @@: lods word ptr cs:[si] cmp al,0FFh jz loc_28AB cmp al,bl jz loc_28AF shr ax,8 add si,ax jmp @b loc_28AB: mov al,bh jmp short loc_28BB loc_28AF: mov cl,ah xor ch,ch @@: lods byte ptr cs:[si] cmp al,bh jz loc_28BB loop @b loc_28BB: xor ah,ah pop bx pop cx pop ds mov si,0DDBh cmp byte ptr ss:[34Ch],0 jz @f mov word ptr ss:[326h],53h ; 'S' @@: push ds push ax push bx mov ds,cs:[new_DS] mov bx,ds:[326h] @@: lodsb cmp al,0FFh jz @f cmp al,bl jz @f add si,3 jmp short @b @@: lodsw cmp ah,0FFh jz @f mov ds:328h,ah @@: cmp al,0FFh jz @f mov ds:329h,al @@: lodsb cmp al,0FFh jz @f mov ds:325h,al @@: pop bx pop ax pop ds pop si a2: call sub_2742 or word ptr [si+16h],1 stc loc_2826: mov [si],ax retn loc_6C38: pop dx pop cx loc_6C81: pop bx mov word ptr [si],0 lds si,ss:5B0h mov byte ptr [si],0FFh jmp loc_6C94 sub_6FB1 proc test byte ptr ss:5F8h,1 jz @f push ax mov ax,ss:603h or es:[di+2],ax pop ax stc @@: retn sub_6FB1 endp ;--------------------------------------- filename db 'myfile.txt',0 new_DS dw 0A7h table_0B33: db 0Ah, 0E8h, 5Eh, 45h, 0B0h, 82h, 0FEh, 0C4h, 0E8h, 57h, 45h db 0FEh, 0C4h, 0E8h, 3Bh, 45h, 0FEh, 0C4h, 0E8h, 36h, 45h, 0C3h db 60h, 0B4h, 0Ah, 0B3h, 0, 0B7h, 80h, 0B9h, 58h, 0, 9Ch, 0FAh db 0E8h, 14h, 9, 74h, 4, 9Dh, 0F9h, 0EBh, 2, 9Dh, 0F8h, 61h, 0C3h db 3 dup(0), 10h, 3 dup(3 dup(0),1,2 dup(0),10h), 3 dup(0), 1 db 7 dup(0), 80h, 96h, 98h, 0, 40h, 42h, 0Fh, 0, 0A0h, 86h, 1 db 0, 10h, 27h, 2 dup(0), 0E8h, 3, 2 dup(0), 64h, 3 dup(0), 0Ah db 3 dup(0), 1, 7 dup(0), 3 dup (19h, 0F9h), 4, 0F1h, 4Eh end start