Память крошечная все сегменты в одной кучке... org 100h использую 21h для поиска файла по маске. (ищу первый файл ah, 4eh ) функция работает верно...,jnc - срабатывает нормально, но в DTA название файла не вижу ((( по 09Eh - нет имени!!! ...смотрел все пространство 0-100h.нет имени !! ..DTA не переносил ( Чито это может быть?
Les555, Куда-то запропастился мой хрустальный шар для подглядывания исходников... Может, сюда запостишь?
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 не вижу хоть тресни
для того чтобы увидеть имя файла надо создать область 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 (?), '$'
у меня было стойкое впечатление , что область DTA по умолчанию располагается где то в первых 100h... это не ошибка ... это была моя гражданская позиция... выходит что правильная позиция DTA распологается по умолчанию нигде и ее нужно определяьть ...
ну вообще тут малопонятный момент, с кривым определением. не только по вашему мнению, но и по многим другим источникам (у Абеля например, или хотя бы тут на васме) написано, что по дефолту ДТА находится в ПСП. но чтобы она -- ДТА -- там "нашлась", надо ее там сохранить функцией 1AH. несколько маразматично, но няп так и есть.
тут не понял. сорец чего ? программы , что находит файл по маске и выдает соответствующее сообщение.? Уточните что нужно.
Просто не там имя файла ищете. Код (Text): Start: mov ah, 4Eh lea dx, Maska int 21h mov dx, 9Eh ; Здесь имя файла mov [0AAh],'$' ; Здесь конец имени (если все 11 символов) mov ah, 9 int 21h ret Maska db '*.*',0 End Start
На самом деле это значит "все файлы кроме hidden и/или system". В RBIL всё есть. Сочинил маленький тест, всё находится (ASCIIZ имя на 0x80+0x1E, как уже сказано). Запускать с параметром: маской поиска. Для FASM. Код (Text): ; Макрос, определяющий макросы BYTE, WORD и DWORD ; Можно на него не обращать внимания irp pair, BYTE rb, WORD rw, DWORD rd { match mname rdir, pair \{ macro mname [arg] \\{ \\local ! ! equ ? match name[count], arg \\\{ name rdir count restore ! \\\} match [count], arg \\\{ rdir count restore ! \\\} match =?, ! \\\{ arg rdir 1 restore ! \\\} \\} \} } virtual at 0x80; сначала DTA выглядит так BYTE cmdline_len, cmdline[127] end virtual virtual at 0x80; а это уже после int21/4E BYTE drive, ff_template[11], ff_attributes WORD dir_entry, cluster BYTE [4]; можно и так, для безымянного rb BYTE attributes WORD mtime, mdate DWORD size BYTE name[13]; 0x9E end virtual include "Macro\If.Inc"; немного структурных макросов org 0x100 ;;; Обработка ком. строки xor cx, cx mov cl, [cmdline_len] mov si, cmdline @@: lodsb ; пропустить лидирующие пробелы/табы .if al<>' ' cmp al, 9 .endif loopz @b mov dx, mask mov di, dx @@: stosb ; копировать до пробела/таба/конца lodsb .if al<>' ' cmp al, 9 .endif loopne @b .if ~ZERO? ; завершили по концу? stosb ; копировать последний .endif ;;; А вот и то, ради чего весь шорох mov ax, 0x4E00 stosb mov cx, 0x16 ; важны только FA_HIDDEN, FA_SYSTEM и FA_DIREC int 0x21 jc done mov bx, 1 ; выводить будем в stdout @@:; цикл: вывели найденное, поискали ещё mov dx, name ; ВОТ ОНО! mov di, dx or cx, -1 ; сосчитать длину repne scasb not cx dec cx mov ah, 0x40 ; выведем имя int 0x21 jc done mov ah, 0x40 ; на новую строку mov cl, 2 mov dx, crlf int 0x21 jc done mov ah, 0x4F ; поищем ещё int 0x21 jnc @b done: ret crlf db 13, 10 mask:
Drmad, строчку mov [0AAh],'$' ...компилятор не пропускает, но и без нее .. получается тоже самое что и у меня... после поиска файла по адресу ds: 9Eh такая вешь : "00000000000000000000000000" , я в отладчике смотрел. Если у одних работает а у других нет думаю дело в эмуляторе DOS. DTA придется таки определять.
Это естественно, не указан размер операнда. А что за эмулятор? Я попробовал DOSBox 0.72, всё в порядке.
Значит, не выполняется функция. Если в отладчике, то посмотри, что после int 21h в бите C и в регистре AX. Скорей всего C=1, а в AX код какой-то ошибки.
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
Les555, Работает. Создал файл «1.bbb», программа его нашла. Запускал из-под NTVDM (лень перезагружаться в MS-DOS 6.22). Кстати, MASM отлично переваривает русские буквы в строковых литералах (логично что для DOS они должны быть в CP866).
про кодировку понимаю, а что значит "работает" ? Про поиск файла у меня сомнений нет.. в отладчике не посмотрел ...сохранил ли где 21h имя найденного файла ?