Грабли с ДОС функцией "создать файл"

Тема в разделе "WASM.ASSEMBLER", создана пользователем Rockphorr, 13 апр 2007.

  1. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    Создаю я с помощью функции файл с атрибутами в CX=0
    потом опрашиваю атрибуты созданного файла - мне возвращают CX=20h то бишь архив бит установлен, а я такого не заказывал при создании.
    Что за кухня???
    исходничек:

    create_c\
    SEGMENT

    $start:
    mov AX,SEG(file_name)
    mov DS,AX

    lea DX,file_name
    mov CX,0
    mov AH,3Ch
    int 21h

    jc $error
    mov BX,AX

    mov AH,3Eh
    int 21h

    mov AH,43h
    xor AL,AL
    int 21h



    jmp $exit
    $error:
    mov DL,'E'
    mov AH,2h
    int 21h
    $exit:
    mov AH,4Ch
    int 21h

    create_c\
    ENDS

    create_d\
    SEGMENT
    file_name\
    BYTE 'a:\test.txt',0
    create_d\
    ENDS

    create_s\
    SEGMENT STACK
    BYTE 256\
    DUP (?)
    create_s\
    ENDS

    END $start
     
  2. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Попробуй поставить архивный бит в единицу, только зачем это? Вообще принято, чтобы архивный бит у всех файлов стоял. Его используют программы backup'а и некоторые вирусы :derisive:
     
  3. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    Я не против всякого рода соглашений - но тут от соглашения ни шагу в сторону сделать нельзя
    рекомендовали бы создавать файлы с 20h в cx я был бы в восторге а тут ставишь 0 получаешь 20h
     
  4. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Правильно получаеш :)
    Я не знаю для чего это сделано, но при создании указываются только следующие атрибуты:
    Код (Text):
    1. CX       Attribute specified
    2. 00h      Normal
    3. 01h      Read-only
    4. 02h      Hidden
    5. 04h      System
    Остальные берутся по умолчанию.
    Если надо изменить остальные атрибуты используй функцию 43h.

    Код (Text):
    1.         .386p
    2. code        segment para    public  'code'  use16
    3.         assume  cs:code, ds:code
    4.         org 100h
    5.     start:
    6.         mov ah,3Ch
    7.         xor cx,cx
    8.         mov dx,offset fname
    9.         int 21h
    10.         mov ax,4301h
    11.         int 21h
    12.         ret
    13. fname       db  'test.txt',0
    14. code        ends
    15.         end start
    Получаем желаемый ноль ;)