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

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

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

  1. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.771
    Знаю, что БАЯН, но вдруг кому-то пригодится
    1)
    Код (Text):
    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)
    Код (Text):
    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)
    Код (Text):
    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 символов) и чуствительным к регистру
    Код (Text):
    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
    Код (Text):
    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
    Код (Text):
    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
    Код (Text):
    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
    Код (Text):
    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)
    Код (Text):
    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
     
    >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
    Сообщения:
    700
    А я давно хотел память на феррите запилить. Чисто ради интереса, сотню ферритовых колец и не много логики отечественной. К стати раздобыл немного литров ртути, можно на ней тоже сделать. Но стрёмно, она токсичная.
     
  5. 1212

    1212 New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2009
    Сообщения:
    21
    Mikl___ приведите для всех Ваших примеров полный комплект действий с файлом: открытие файла, запись в файл, закрытие файла. В противном случае юные асмитсты не смогут увидеть прелестей DOS-программ.
    Для первого варианта:
    открытие файла - Вы показали, но я бы добавил
    .....
    int 21h
    mov handle, ax;

    запись в файл -
    mov ah,40h
    mov bx,handle
    mov cx,4 ; длинна записи в байтах
    mov dx,offset x: х - записываемая переменная
    int 21h;

    закрытие файла -

    mov ah,3eh
    mov bx, handle
    int 21h
    Прошу простить, если я опередил Ваши мысли и Вы собирались эту информацию поместить позже!
     
  6. 1212

    1212 New Member

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

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.771
    10) Перечитывая Зубкова наткнулся на еще один способ
    Код (Text):
    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)
     
  8. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.771
    Выдираю из io.sys (можно из ntvdm) кусок 21h прерывания, отвечающего за создание файла. Во вложении сорц и СОМ-файл создающий файл на диске и не использующий прерывания. Строго не судите