
Быстрый поиск
Введите фрагмент названия статьи для поиска

Сортировка массива строк на Ассемблере
29.01.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Долго откладывал написание этой функции, но теперь вот прижало. Получилась функция сортировки массива произвольных текстовых строк в формате ASCIIZ усовершенствованным методом "пузырька". Усовершенствование заключается в том, что если при очередном проходе ни одной сортировки не было выполнено, то дальнейшая обработка массива прекращается. В некоторых случаях это дает значительный выигрыш в скорости работы. Однако, алгоритм сортировки "пузырьком" в любом случае является самым медленным, поэтому для очень больших массивов эта функция не подойдет. Но мне для больших объемов ее и не надо, на массиве из нескольких сотен или даже тысяч строк скорость работы функции меня вполне устраивает.Code (Assembler) : Убрать нумерацию
- ;------------------------------------------------------------------
- ; Функция сортировки массива строк
- ; by ManHunter / PCL
- ; http://www.manhunter.ru
- ;
- ; Сортировка выполняется усовершенствованным методом "пузырька"
- ; Параметры:
- ; lpArray - указатель на массив адресов строк
- ; dFlag - метод сортировки: TRUE - по возрастанию,
- ; FALSE - по убыванию
- ; На выходе:
- ; отсортированный согласно правилу массив адресов строк
- ;------------------------------------------------------------------
- proc SortArray lpArray:dword, dFlag:dword
- pusha
- ; Указатель на массив адресов строк
- mov esi,[lpArray]
- mov ebx,[dFlag]
- sa_sort_1:
- ; Проверка на 0 - признак окончания массива
- mov eax,[esi]
- or eax,eax
- jz sa_stop_sort
- or bh,bh
- jnz sa_stop_sort
- ; Сравниваем, начиная со следующего элемента
- lea edi,[esi+4]
- ; Установить флаг, что сортировка не требуется,
- ; если дальнейший остаток массива уже отсортирован
- mov bh,1
- sa_sort_2:
- ; Следующий элемент 0 - массив закончился
- mov edx,[edi]
- or edx,edx
- jz sa_next_sort
- ; Сохранить текущие значения указателей
- push esi edi
- ; Указатели на строки
- mov esi,eax
- mov edi,edx
- sa_compare_string:
- ; Сравнить символы в строках
- mov cl,byte [edi]
- mov ch,byte [esi]
- ; Если символы равны, то сравнить следующие
- cmp cl,ch
- je sa_equal
- ; Проверка больше-меньше в зависимости от флага
- cmp bl,0
- jz @f
- cmp cl,ch
- ja ss_next_string
- jmp sa_change_offs
- @@:
- cmp cl,ch
- jb ss_next_string
- sa_change_offs:
- ; Поменять местами адреса строк
- xchg eax,edx
- ; Сбросить флаг, что сортировка не требуется
- xor bh,bh
- jmp ss_next_string
- sa_equal:
- ; Если закончилась строка, то перейти к следующей паре
- or cl,cl
- jz ss_next_string
- ; Перейти к следующей паре символов
- inc esi
- inc edi
- jmp sa_compare_string
- ss_next_string:
- ; Восстановить значения указателей и записать в них
- ; значения адресов строк, без разницы изменившихся или нет
- pop edi esi
- mov [esi],eax
- mov [edi],edx
- ; Перейти к следующему элементу массива
- add edi,4
- jmp sa_sort_2
- sa_next_sort:
- ; Перейти к следующему элементу массива
- add esi,4
- jmp sa_sort_1
- sa_stop_sort:
- popa
- ret
- endp
Читать статью целиком »
Просмотров: 18559 | Комментариев: 7

Концерт группы Haggard в "Точке"
26.01.2009 | Категория: Жизнь в оффлайне | Автор: ManHunter

Концерт группы Haggard
Первая попытка попасть на этот концерт была неудачной, его перенесли с 25-го ноября на 2-е декабря. Только зря в снег и ветер тащился в другой конец города чтобы полюбоваться на объявление на дверях клуба. Однако и через неделю в клубе меня ждало разочарование, клуб украшало такое же объявление об отмене и переносе концерта на середину января. Мощный луч диареи в сторону ответственных за обновление сайта клуба за то, что информация о переносах в обеих случаях появлялась чуть ли не во время запланированного начала концерта.
Читать статью целиком »
Просмотров: 4710 | Комментариев: 4

Apache Server Control 1.1a
23.01.2009 | Категория: Мои программы | Автор: ManHunter

Скриншот программы Apache Server Control
Еще одна программа, написанная для личных нужд. Apache Server Control позволяет управлять HTTP-сервером Apache версий 1.3.x под Windows: запускать, останавливать и перезапускать его службу. В дистрибутивах Apache 2.x аналогичная программа уже имеется. Кроме управления сервером вы можете редактировать файлы hosts и httpd.conf прямо в окне Apache Server Control. Программа должна находиться в одном каталоге с установленным Apache, тогда все пути к нужным файлам будут определены автоматически. Я использую Apache Server Control когда надо по-быстрому добавить локальный хост, прописать его во все настройки и перезапустить Apache. Может еще кому пригодится.
Читать статью целиком »
Просмотров: 5183 | Комментариев: 5

"Ленивые" картофельные шаньги
21.01.2009 | Категория: А еще я туда ем! | Автор: ManHunter

"Ленивые" картофельные шаньги
Этот рецепт я подсмотрел в детстве у своей бабушки, а теперь он меня иногда выручает. Бывают такие ситуации, когда совершенно нет времени возиться на кухне, а хочется приготовить что-нибудь вкусное. Или приходят нежданные гости, а угостить их нечем. Тут вам пригодятся "ленивые" шаньги. Готовятся они очень быстро и просто, не требуют больших финансовых затрат и труднодоступных продуктов. Обычно все необходимое уже есть дома, даже не приходится идти в магазин.
Читать статью целиком »
Просмотров: 22156 | Комментариев: 25

Рекурсивный обход дерева каталогов
19.01.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Обход дерева каталогов является одной из классических прикладных задач на применение рекурсии. В Windows штатных API-функций для этого нет, поэтому поиск файлов выполняется при помощи пары API-функций FindFirstFile и FindNextFile. Совершенно непонятно, почему разработчики Windows не дали возможность точно настраивать критерии поиска, ограничившись только маской имени файла. Даже в MS-DOS для решения аналогичной задачи можно было задать по крайней мере атрибуты файлов, например для поиска только каталогов. Более расширенные возможности для поиска предоставляет API-функция FindFirstFileEx, но она доступна только в операционной системе Windows 2000 и выше.Для рекурсивного обхода дерева каталогов я написал следующую функцию. Она сканирует дерево каталогов, начиная с указанного, и передает все найденные имена файлов в заданную функцию-обработчик. Все действия с найденными файлами выполняются уже в ней.
Code (Assembler) : Убрать нумерацию
- ;------------------------------------------------------------------
- ; Функция рекурсивного обхода дерева каталогов
- ; (C) ManHunter / PCL
- ; http://www.manhunter.ru
- ;
- ; Параметры вызова:
- ; lpFStr - указатель на начальный каталог без завершающего слеша.
- ; он должен быть в буфере размером не менее MAX_PATH байт
- ; lpProc - указатель на callback-функцию для передачи имен файлов,
- ; это обязательный параметр
- ; dFlag - флаг "передавать в callback-функцию имена найденных
- ; каталогов" (TRUE/FALSE)
- ;------------------------------------------------------------------
- proc FindFileRecursive lpFStr:dword,lpProc:dword,dFlag:dword
- local hFind:DWORD ; Локальный хэндл текущего поиска
- locals
- FndData WIN32_FIND_DATA ; Локальная структура WIN32_FIND_DATA
- endl
- ; Сохранить изменяемые регистры
- push ebx ecx edx
- ; Добавить к пути поиска '\*.*'
- invoke lstrcat,[lpFStr],ff_mask
- ; Найти первый файл
- lea eax,[FndData]
- push eax
- invoke FindFirstFile,[lpFStr]
- ; В случае ошибки полностью прекратить дальнейшее сканирование
- cmp eax,INVALID_HANDLE_VALUE
- jne @f
- xor eax,eax
- jmp ff_exit
- @@:
- ; Сохранить хэндл текущего поиска
- mov [hFind],eax
- ff_chk_file:
- ; Проверить имя файла на недопустимое
- lea eax,[FndData.cFileName]
- push eax
- ; Имя файла '.'
- invoke lstrcmp,ff_skip1
- or eax,eax
- ; Да, пропустить
- jz ff_next_file
- lea eax,[FndData.cFileName]
- push eax
- ; Имя файла '..'
- invoke lstrcmp,ff_skip2
- or eax,eax
- ; Да, пропустить
- jz ff_next_file
- ; Если установлен флаг dFlag=TRUE, то передавать в callback-процедуру
- ; все найденные результаты, в том числе и каталоги
- cmp [dFlag],0
- jne @f
- ; Установлен флаг передавать только файлы. Проверить атрибуты
- ; найденного файла
- mov eax,[FndData.dwFileAttributes]
- and eax,FILE_ATTRIBUTE_DIRECTORY
- ; Это каталог, пропустить
- jnz ff_do_not_callback
- @@:
- ; Вычислить длину текущей строки поиска и обрезать '*.*'
- invoke lstrlen,[lpFStr]
- sub eax,3
- add eax,[lpFStr]
- mov byte [eax],0
- push eax
- ; Дописать к пути имя найденного файла или каталога
- lea eax,[FndData.cFileName]
- push eax
- invoke lstrcat,[lpFStr]
- ; Передать имя файла в callback-функцию
- stdcall [lpProc],[lpFStr]
- ; Вернуть маску поиска на место
- pop ecx
- mov dword [ecx],'*.*'
- ; Если callback-функция вернула 0, то прекратить сканирование
- or eax,eax
- jz ff_stop_scan
- ; Это каталог?
- mov eax,[FndData.dwFileAttributes]
- and eax,FILE_ATTRIBUTE_DIRECTORY
- je ff_next_file
- ff_do_not_callback:
- ; Вычислить длину текущей строки поиска и обрезать '*.*'
- invoke lstrlen,[lpFStr]
- sub eax,3
- add eax,[lpFStr]
- mov byte [eax],0
- push eax
- ; Дописать к пути имя найденного каталога
- lea eax,[FndData.cFileName]
- push eax
- invoke lstrcat,[lpFStr]
- ; Рекурсивный вызов поиска файлов в новом каталоге
- stdcall FindFileRecursive,[lpFStr],[lpProc],[dFlag]
- ; Вернуть маску поиска на место
- pop ecx
- mov dword [ecx],'*.*'
- ; Если callback-функция вернула 0, то прекратить сканирование
- or eax,eax
- jz ff_stop_scan
- ff_next_file:
- ; Найти следующий файл
- lea eax,[FndData]
- push eax
- invoke FindNextFile,[hFind]
- or eax,eax
- ; Файл найден, обработать его
- jnz ff_chk_file
- ; По умолчанию установить флаг "продолжать сканирование"
- mov eax,TRUE
- ff_stop_scan:
- ; Закрыть хэндл текущего поиска
- push eax
- invoke FindClose,[hFind]
- pop eax
- ff_exit:
- ; Восстановить измененные регистры
- pop edx ecx ebx
- ; Возврат из процедуры.
- ; Код возврата EAX=1 - продолжать сканирование, EAX=0 - стоп
- ret
- ff_mask db '\*.*',0 ; Маска файлов для поиска
- ff_skip1 db '.',0 ; Запрещенное имя файла
- ff_skip2 db '..',0 ; Запрещенное имя файла
- endp
Читать статью целиком »
Просмотров: 9086 | Комментариев: 2
