![]() |
|
![]() ![]() ![]() |
|
dvd |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 151 Регистрация: 6.7.2005 Репутация: нет Всего: 1 |
Как найти файл с самым длинным именем в КК (дискета)?
Помогите, плз... --------------------
Санкт-Петербург такси |
|||
|
||||
ds29 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 15.3.2006 Репутация: 1 Всего: 2 |
под что?
общий принцып: 1. поис первого файла и замер длины (в конце имени 0, т.е. считай кол-во символов от начала до нуля) 2. заноси в строковую переменную имя и в другую, временную переменную, кол-во символов. 3. поиск следующего файла , сравнение длин: если длина больше то заменяй переменную с именем файла, иначе пункт №3. когда пройдёшь все файлы, в строковой переменной с именем останется самое длинное имя, а во временной, кол-во сим-лов. |
|||
|
||||
e-moe |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 3.8.2004 Где: Украина, Донецк Репутация: нет Всего: 4 |
Да, и не забывай учитывать что на дискете могут быть имена как 8+3 так и LFN ;)
|
|||
|
||||
dvd |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 151 Регистрация: 6.7.2005 Репутация: нет Всего: 1 |
Да принцип-то понятен... А вот с реализацией есть проблемы. Имена можно ограничить длиной "8".
--------------------
Санкт-Петербург такси |
|||
|
||||
ds29 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 15.3.2006 Репутация: 1 Всего: 2 |
ты под что пишешь, если под Win32 то там такая структура:
typedef struct _WIN32_FIND_DATA { // wfd DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; TCHAR cFileName[ MAX_PATH ]; TCHAR cAlternateFileName[ 14 ]; } WIN32_FIND_DATA; здесь: cFileName - длинное имя (260) и cAlternateFileName - короткое имя (14) т.е. (8.3) |
|||
|
||||
e-moe |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 88 Регистрация: 3.8.2004 Где: Украина, Донецк Репутация: нет Всего: 4 |
dvd, в чем проблема?
используй, например, ah=4eh/4fh int 21h (это если короткие имена) Это сообщение отредактировал(а) e-moe - 3.6.2006, 21:13 |
|||
|
||||
dvd |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 151 Регистрация: 6.7.2005 Репутация: нет Всего: 1 |
Ну так я перебираю символы имени файла:
cycl1: mov ah,2 mov dl,Sect[di] cmp dl,20h je net inc di cmp di,si jl cycl1 Дальше, по идее, нужно создать что-то наподобие стандартного поиска максимума (if a> max then max:=a)... --------------------
Санкт-Петербург такси |
|||
|
||||
ds29 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 15.3.2006 Репутация: 1 Всего: 2 |
dvd, так под что пишешь то? DOS или WIN32 ???
вот небольшой пример: .data big_name db 14 dup(0) ; длинное имя now_name db 14 dup(0) ; текущее имя name_len db 0 ;длина имени .code find_next_file: ;тут находишь имя следующего файл (его в now_name) ;/// ;/// ;.. ;если файлов больше нет то jmp end_find_dig_f xor ax,ax lea di,now_name m1: cmp [di],al ; (сравнение с нулём) jne m2 inc ah ;счётчик inc di jmp m1 m2: cmp ah,name_len jb m3 ;если текущее имя меньше mov cx,14 lea di,now_name lea si,big_name mov name_len,ah recopy: ; если текущее имя больше то big_name = now_name & name_len = ah mov al,[di] mov [si],al inc di inc si loop recopy m3: ;тут на данный момент в big_name - будет имя наибольшего по кол-ву сим. файла ;а в name_len - кол-во символов в нём jmp find_next_file end_find_dig_f: ;тут окончательный результат ------------------- p.s. теоретически рабочий код. так на чём и под что ты пишешь?? |
|||
|
||||
dvd |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 151 Регистрация: 6.7.2005 Репутация: нет Всего: 1 |
ds29, спасибо за пример... Я примерно так и делал, но программа все равно уперто отказывалась правильно работать...
Только вопрос: зачем ты используешь сравнение с нулем? Я пишу под DOS TASM --------------------
Санкт-Петербург такси |
|||
|
||||
ds29 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 15.3.2006 Репутация: 1 Всего: 2 |
если под ДОС (да и под Вин) , имя файла возвращается ASCIIZ строкой (т.е. в конце 00h)
сканирую строку и сравниваю посимвольно с нулём, если ноль, то предыдущий символ был последний, => текущее значение счётчика символов = кол-ву символов в имени. |
|||
|
||||
dvd |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 151 Регистрация: 6.7.2005 Репутация: нет Всего: 1 |
Такое сканирование будет неправильным, т.к. конец имени файла обозначается 20h, поэтому проверка имени файла будет выглядеть так, как я описал чуть выше:
mov ah,2 mov dl,Sect[di] cmp dl,20h Этот метод уже проверен - имена выводятся правильно, а вот самое длинное никак не получается найти... --------------------
Санкт-Петербург такси |
|||
|
||||
ds29 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 15.3.2006 Репутация: 1 Всего: 2 |
dvd, аргументируй
ты хочешь сказать что в структуре DTA ----------------------------------------------------------- +00h 21 Данные, используемые функцией 4Fh (для нас не представляют интереса) +15h 1 Атрибуты найденного файла/каталога (см. ниже) +16h 2 Время создания/редактирования файла/каталога (в специальном формате) +18h 2 Дата создания/редактирования файла/каталога (в специальном формате) +1Ah 4 Размер файла +1Eh 13 Имя файла/каталога в формате ASCIIZ ------------------------------------------------------------- данные находящиеся со смещением в +1Eh (т.е. имя файла) находятся НЕ в формате ASCIIZ ? если да, то приведи ссылку на официальный источник. (мои утв. основываются на мн-ве источников, например *MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА* (http://e-dok.narod.ru/msdos/book/) , конкретно это прерывание (http://e-dok.narod.ru/msdos/book/gl18-84.html)) ************************************************************** а что не получается с поиском самого длинного имени, я же привел пример алогоритма. |
|||
|
||||
dvd |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 151 Регистрация: 6.7.2005 Репутация: нет Всего: 1 |
Я знаю точно (и это проверенно), что конец файла проверяется именно таким способом, но допускаю и другие варианты... Это не столь важно...
Сам алгоритм понятен, но все равно не хочет работать ![]() --------------------
Санкт-Петербург такси |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Asm: Общие вопросы" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |