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

Сортировка перемешиванием на Ассемблере
26.05.2024 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сортировка перемешиванием, она же шейкерная или двунаправленная сортировка - оптимизированная разновидность алгоритма пузырьковой сортировки. В процессе сортировки выполняется многократный проход по массиву, соседние элементы сравниваются и, в случае необходимости, меняются местами. Массив просматривается поочередно справа налево и слева направо, из-за этого алгоритм получил свое название. В результате каждого прогона крупные и мелкие элементы массива поочередно перемещаются в конец и начало массива соответственно. Границы рабочей части массива, то есть той части массива, где происходит движение, устанавливаются в месте последнего обмена на каждой итерации.Code (Assembler) : Убрать нумерацию
- ;----------------------------------------------------------------
- ; Функция сортировки массива DWORD перемешиванием
- ; by ManHunter / PCL (www.manhunter.ru)
- ;----------------------------------------------------------------
- ; Параметры:
- ; lpArray - указатель на массив DWORD
- ; dLen - количество элементов в массиве
- ;----------------------------------------------------------------
- proc shaker_sort lpArray:DWORD, dLen:DWORD
- pusha
- mov esi,[lpArray]
- ; left
- mov eax,1
- ; right
- mov ebx,[dLen]
- cmp ebx,2
- jb .loc_ret
- dec ebx
- .loc_loop_main:
- ; swap_flag = false
- xor edi,edi
- mov ecx,eax
- .loc_loop_1:
- cmp ecx,ebx
- ja .loc_done_1
- mov edx,dword [esi+ecx*4-4]
- cmp dword [esi+ecx*4],edx
- ; Для сортировки по возрастанию заменить на ja
- jna @f
- push dword [esi+ecx*4-4]
- push dword [esi+ecx*4]
- pop dword [esi+ecx*4-4]
- pop dword [esi+ecx*4]
- ; swap_flag = true
- inc edi
- @@:
- inc ecx
- jmp .loc_loop_1
- .loc_done_1:
- dec ebx
- mov ecx,ebx
- .loc_loop_2:
- cmp ecx,eax
- jb .loc_done_2
- mov edx,dword [esi+ecx*4]
- cmp dword [esi+ecx*4-4],edx
- ; Для сортировки по возрастанию заменить на jb
- jnb @f
- push dword [esi+ecx*4-4]
- push dword [esi+ecx*4]
- pop dword [esi+ecx*4-4]
- pop dword [esi+ecx*4]
- ; swap_flag = true
- inc edi
- @@:
- dec ecx
- jmp .loc_loop_2
- .loc_done_2:
- inc eax
- or edi,edi
- jnz .loc_loop_main
- .loc_ret:
- popa
- ret
- endp
Читать статью целиком »
Просмотров: 349 | Комментариев: 7

Запись в архивы RAR5 без помощи архиватора
23.05.2024 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня я расскажу, как можно добавить какой-нибудь файл в архив формата RAR5 без использования программ-архиваторов. Что это такое и для чего вообще надо, об этом можно почитать в предыдущих статьях.Формат RAR5 появился с выходом 5-й версии архиватора WinRAR. Он очень сильно отличается от старого формата архивов RAR, изменились структуры заголовков, появились дополнительные поля, некоторые поля вовсе исчезли, превратившись в самостоятельные блоки данных. Одним из главных нововведений, которое приходится учитывать, это появление данных так называемого формата vint - "variable length integer". Это последовательности байт заранее неизвестной длины в количестве от 1 до 10, чего достаточно для манипуляций с 64-битными числами. Как написано в документации, если понадобится, то максимальная длина последовательностей может быть увеличена. Каждый байт последовательности vint имеет только 7 младших значащих битов, старший 8-й бит является информационным. Если он равен 1, то требуется обрабатывать следующий байт последовательности, если 0, то это последний байт данных в текущей последовательности. Оставшиеся значащие биты слепляются в полноценные байты, из которых формируется итоговое целочисленное значение.
100011010 01011011 => 000001101 01011011
В некоторых случаях я могу оправдать такой подход, например, размер файла может быть как несколько терабайт, так и несколько байт, длина vint-последовательности для хранения таких значений будет разной. Хотя и тут можно поспорить, я не думаю, что размер бытовых файлов не поместится в 64-битное число, а для архивирования петабайт данных этих ваших интернетов наверняка есть какие-то более другие решения. Если взять всякую мелочевку типа флагов, идентификатора заголовка, атрибутов файла и подобного, почему нельзя было оставить фиксированные значения? Вряд ли автор совершит столь большие прорывы в разработке WinRAR, что понадобится QWORD для флагов или WORD для типов заголовков. А в документации сплошь и рядом поля формата vint. Но это создает проблемы в основном при чтении имеющегося архива, тогда как при записи можно позволить себе определенные упрощения, зафиксировав размер некоторых полей.
Читать статью целиком »
Просмотров: 673 | Комментариев: 2

Сортировка вставками на Ассемблере
13.05.2024 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сортировка вставками - это алгоритм сортировки, который преобразует массив данных путем поочередного включения каждого элемента в упорядоченную последовательность элементов. Он подразумевает разделение массива на отсортированную и неотсортированную части. На каждом шаге из неотсортированной части выбирается элемент и вставляется в правильное место в отсортированной части. И так продолжается до тех пор, пока весь набор входных данных не будет отсортирован.Алгоритм работает следующим образом. Массив разделяется на две части: отсортированную (в начале пустая) и неотсортированную. На каждом шаге выбирается элемент из неотсортированной части массива. Этот элемент вставляется в отсортированную часть массива так, чтобы отсортированная часть оставалась упорядоченной. Граница между отсортированной и неотсортированной частями смещается, и процесс повторяется для оставшихся элементов. После выполнения всех шагов весь массив становится отсортированным.
Code (Assembler) : Убрать нумерацию
- ;----------------------------------------------------------------
- ; Функция сортировки массива DWORD методом вставок
- ; by ManHunter / PCL (www.manhunter.ru)
- ;----------------------------------------------------------------
- ; Параметры:
- ; lpArray - указатель на массив DWORD
- ; dLen - количество элементов в массиве
- ;----------------------------------------------------------------
- proc insertion_sort lpArray:DWORD, dLen:DWORD
- pusha
- mov esi,[lpArray]
- mov ecx,[dLen]
- xor edi,edi
- inc edi
- .loc_loop_1:
- mov ebx,dword [esi+edi*4]
- mov edx,edi
- dec edx
- .loc_loop_2:
- cmp edx,0
- jb @f
- cmp dword [esi+edx*4],ebx
- jbe @f
- push dword [esi+edx*4+4]
- push dword [esi+edx*4]
- pop dword [esi+edx*4+4]
- pop dword [esi+edx*4]
- dec edx
- jmp .loc_loop_2
- @@:
- mov dword [esi+edx*4+4],ebx
- inc edi
- cmp edi,ecx
- jb .loc_loop_1
- .loc_ret:
- popa
- ret
- endp
Читать статью целиком »
Просмотров: 480 | Комментариев: 0

Получение названий трекерных композиций на Ассемблере
01.05.2024 | Категория: Образ мышления: Assembler | Автор: ManHunter

Получение названий трекерных композиций на Ассемблере
Трекерная музыка занимает промежуточное место между цифровым звуком и нотной записью. Она популярна еще со времен MS-DOS, ее часто используют при оформлении различных патчей и кейгенов, а также в демосцене. Как правило, внутренний формат у этих музыкальных файлов не очень сложный и потому не поддерживает привычные метаданные. Тем не менее, информация о названии трека в них чаще всего содержится. В этой статье я расскажу, как можно извлечь эту информацию из наиболее популярных форматов трекерных композиций.
Читать статью целиком »
Просмотров: 428 | Комментариев: 3

Тюнингуем контрол msctls_trackbar32
28.04.2024 | Категория: Образ мышления: Assembler | Автор: ManHunter
За время существования этого сайта тут было доработано уже несколько различных стандартных элементов управления, настало время провести тюнинг контрола msctls_trackbar32. Создается он обычным образом, например, через прописывание в ресурсах. Обязательно надо добавить в импорт библиотеку comctl32.dll и вызвать функцию InitCommonControls. Ну а поскольку мы будем добавлять к контролу различные нестандартные функции, то и делать это будем в специально отведенной процедуре-обработчике. Для этого воспользуемся субклассированием. Действия стандартные, примеров субклассирования на этом сайте предостаточно.Code (Assembler) : Убрать нумерацию
- ; Настройки ползунка
- invoke GetDlgItem,[hwnddlg],IDC_PROGRESS
- mov [track],eax
- ; Установить наш собственный обработчик
- invoke SetWindowLong,[track],GWL_WNDPROC,TrackProc
- ; Сохранить хэндл предыдущего обработчика
- invoke SetWindowLong,[track],GWL_USERDATA,eax
Читать статью целиком »
Просмотров: 361 | Комментариев: 0
