использую int 21h для поиска фала по маске ..в DTA нет ничего (((

Тема в разделе "WASM.BEGINNERS", создана пользователем Les555, 30 июн 2010.

  1. Les555

    Les555 New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2010
    Сообщения:
    15
    Память крошечная все сегменты в одной кучке...
    org 100h
    использую 21h для поиска файла по маске. (ищу первый файл ah, 4eh )
    функция работает верно...,jnc - срабатывает нормально, но в DTA название файла не вижу ((( по 09Eh - нет имени!!! ...смотрел все пространство 0-100h.нет имени !!
    ..DTA не переносил ( Чито это может быть?
     
  2. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Les555,

    Куда-то запропастился мой хрустальный шар для подглядывания исходников... Может, сюда запостишь? :derisive:
     
  3. Les555

    Les555 New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2010
    Сообщения:
    15
    org 100h
    ..............
    mov ah,04eh ; - поиск первого файла
    sub cx,cx ; 0 - файлы со всеми атрибутами
    mov dx, offset m_file

    int 21h
    ret
    m_file db ' *.bbb ',0

    .........
    в директории есь файл aaaa.bbb и программка гооврит что да , есть такой ...но имени файла я в диапазоне 0..100h
    по сегменту DS не вижу хоть тресни
     
  4. Guru_of_Zen

    Guru_of_Zen Member

    Публикаций:
    0
    Регистрация:
    21 янв 2010
    Сообщения:
    288
    для того чтобы увидеть имя файла надо создать область DTA -- в этом ваша ошибка что вы ее не создали

    делается примерно так: до вызова функции 4eh --

    mov ah,1ah ; код функции установки DTA
    mov dx,offset dta ; адрес DTA
    int 21h ; вызов обработчика прерывания

    после этого можно начинать поиск функцией 4eh

    далее. в принципе на этом можно и закончить (в конце программы поставить еще разок mov dx,offset dta ; потом в дебаге набрать d dx:0)

    но можно и отобразить на экран.

    сама DTA (размером 2BH (43) байта) состоит из нескольких областей.
    вам нужно смещение 1EH -- в нем имя найденного файла (в конце 0H).

    выводим на дисплей:

    mov ah,9h
    mov dx,offset dta[1EH]
    int 21h

    зы разумеется надо определить такие данныя:

    dta db 2BH dup (?), '$'
     
  5. Les555

    Les555 New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2010
    Сообщения:
    15
    у меня было стойкое впечатление , что область DTA по умолчанию располагается где то в первых 100h...
    это не ошибка ... это была моя гражданская позиция... выходит что правильная позиция DTA распологается по умолчанию нигде и ее нужно определяьть ...
     
  6. Guru_of_Zen

    Guru_of_Zen Member

    Публикаций:
    0
    Регистрация:
    21 янв 2010
    Сообщения:
    288
    ну вообще тут малопонятный момент, с кривым определением.

    не только по вашему мнению, но и по многим другим источникам (у Абеля например, или хотя бы тут на васме) написано, что по дефолту ДТА находится в ПСП.

    но чтобы она -- ДТА -- там "нашлась", надо ее там сохранить функцией 1AH.

    несколько маразматично, но няп так и есть.
     
  7. Guru_of_Zen

    Guru_of_Zen Member

    Публикаций:
    0
    Регистрация:
    21 янв 2010
    Сообщения:
    288
    ps пожалуйста если не трудно дайте сорец полностью.
     
  8. Les555

    Les555 New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2010
    Сообщения:
    15
    тут не понял. сорец чего ? программы , что находит файл по маске и выдает соответствующее сообщение.? Уточните что нужно.
     
  9. drmad

    drmad New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    332
    Адрес:
    Russia
    Просто не там имя файла ищете. :)

    Код (Text):
    1. Start:
    2.  mov ah, 4Eh
    3.  lea dx, Maska
    4.  int 21h
    5.  mov dx, 9Eh     ; Здесь имя файла
    6.  mov [0AAh],'$'  ; Здесь конец имени (если все 11 символов)
    7.  mov ah, 9
    8.  int 21h
    9.  ret
    10. Maska db '*.*',0
    11.  End Start
     
  10. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    На самом деле это значит "все файлы кроме hidden и/или system". В RBIL всё есть.

    Сочинил маленький тест, всё находится (ASCIIZ имя на 0x80+0x1E, как уже сказано). Запускать с параметром: маской поиска. Для FASM.
    Код (Text):
    1. ; Макрос, определяющий макросы BYTE, WORD и DWORD
    2. ; Можно на него не обращать внимания
    3. irp pair, BYTE rb, WORD rw, DWORD rd {
    4.   match mname rdir, pair \{
    5.     macro mname [arg] \\{
    6.       \\local !
    7.       ! equ ?
    8.       match name[count], arg \\\{
    9.     name rdir count
    10.     restore !
    11.       \\\}
    12.       match [count], arg \\\{
    13.     rdir count
    14.     restore !
    15.       \\\}
    16.       match =?, ! \\\{
    17.     arg rdir 1
    18.     restore !
    19.       \\\}
    20.     \\}
    21.   \}
    22. }
    23.  
    24. virtual at 0x80; сначала DTA выглядит так
    25.   BYTE cmdline_len, cmdline[127]
    26. end virtual
    27.  
    28. virtual at 0x80; а это уже после int21/4E
    29.   BYTE drive, ff_template[11], ff_attributes
    30.   WORD dir_entry, cluster
    31.   BYTE [4]; можно и так, для безымянного rb
    32.   BYTE attributes
    33.   WORD mtime, mdate
    34.   DWORD size
    35.   BYTE name[13]; 0x9E
    36. end virtual
    37.  
    38. include "Macro\If.Inc"; немного структурных макросов
    39.  
    40.     org 0x100
    41. ;;; Обработка ком. строки
    42.     xor cx, cx
    43.     mov cl, [cmdline_len]
    44.     mov si, cmdline
    45. @@: lodsb           ; пропустить лидирующие пробелы/табы
    46.       .if al<>' '
    47.     cmp al, 9
    48.       .endif
    49.     loopz   @b
    50.     mov dx, mask
    51.     mov di, dx
    52. @@: stosb           ; копировать до пробела/таба/конца
    53.     lodsb
    54.       .if al<>' '
    55.     cmp al, 9
    56.       .endif
    57.     loopne  @b
    58.       .if ~ZERO?        ; завершили по концу?
    59.     stosb           ; копировать последний
    60.       .endif
    61. ;;; А вот и то, ради чего весь шорох
    62.     mov ax, 0x4E00
    63.     stosb
    64.     mov cx, 0x16    ; важны только FA_HIDDEN, FA_SYSTEM и FA_DIREC
    65.     int 0x21
    66.     jc  done
    67.     mov bx, 1       ; выводить будем в stdout
    68. @@:; цикл: вывели найденное, поискали ещё
    69.     mov dx, name    ; ВОТ ОНО!
    70.     mov di, dx
    71.     or  cx, -1      ; сосчитать длину
    72.     repne scasb
    73.     not cx
    74.     dec cx
    75.     mov ah, 0x40    ; выведем имя
    76.     int 0x21
    77.     jc  done
    78.     mov ah, 0x40    ; на новую строку
    79.     mov cl, 2
    80.     mov dx, crlf
    81.     int 0x21
    82.     jc  done
    83.     mov ah, 0x4F    ; поищем ещё
    84.     int 0x21
    85.     jnc @b
    86. done:   ret
    87. crlf    db  13, 10
    88. mask:
     
  11. Les555

    Les555 New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2010
    Сообщения:
    15
    Drmad, строчку mov [0AAh],'$' ...компилятор не пропускает, но и без нее ..
    получается тоже самое что и у меня...
    после поиска файла по адресу ds: 9Eh такая вешь : "00000000000000000000000000" , я в отладчике смотрел. Если у одних работает а у других нет думаю дело в эмуляторе DOS. DTA придется таки определять.
     
  12. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Это естественно, не указан размер операнда.

    А что за эмулятор? Я попробовал DOSBox 0.72, всё в порядке.
     
  13. drmad

    drmad New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    332
    Адрес:
    Russia
    Значит, не выполняется функция. Если в отладчике, то посмотри, что после int 21h в бите C и в регистре AX. Скорей всего C=1, а в AX код какой-то ошибки.
     
  14. Les555

    Les555 New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2010
    Сообщения:
    15
    drmad, проверка состояния регистра флагов у меня часть программульки...так что процедура поиска не врет ! но говорит правду..я проверял , но при этом результат поиска не сохраняет.....(в ax - тоже 0000)
    не верьте 04Eh от 21h , может обмануть !


    CSEG segment
    assume es:CSEG, ss:CSEG ,ds:CSEG, cs:CSEG
    org 100h
    start:
    mov ah,04Eh
    sub cx,cx
    mov dx, offset mask_
    int 21h

    mov ah,9
    mov dx, offset nfi
    jc viv ; не нашли
    mov dx, offset fi
    viv :
    int 21h
    mov ah,10h
    int 16h

    ret
    mask_ db '*.bbb',0
    fi db ' i - got $'
    nfi db ' i - not got $'


    CSEG ends
    end start
     
  15. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Les555,

    Работает. Создал файл «1.bbb», программа его нашла. Запускал из-под NTVDM (лень перезагружаться в MS-DOS 6.22).

    Кстати, MASM отлично переваривает русские буквы в строковых литералах (логично что для DOS они должны быть в CP866).
     
  16. Les555

    Les555 New Member

    Публикаций:
    0
    Регистрация:
    30 июн 2010
    Сообщения:
    15
    про кодировку понимаю, а что значит "работает" ? Про поиск файла у меня сомнений нет.. в отладчике не посмотрел ...сохранил ли где 21h имя найденного файла ?
     
  17. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Да, начиная с 0x9E.