
Быстрый поиск
Введите фрагмент названия статьи для поиска
Использование иконок разных размеров в ресурсах
12.02.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Большим плюсом Flat Assembler является то, что при разработке создается минимальное количество файлов. Описания ресурсов хранятся прямо в исходнике ASM, что тоже очень удобно. Например, в официальной документации и исходниках описание главной иконки в ресурсах исполняемого файла выглядит примерно так:Code (Assembler) : Убрать нумерацию
- section '.rsrc' resource data readable
- directory RT_ICON, icons,\
- RT_GROUP_ICON, group_icons
- resource icons,\
- 1, LANG_NEUTRAL, icon_data
- resource group_icons,\
- 1, LANG_NEUTRAL, main_icon
- ; Описание одиночной иконки
- icon main_icon, icon_data, 'main_icon.ico'
Code (Assembler) : Убрать нумерацию
- section '.rsrc' resource data readable
- directory RT_ICON, icons,\
- RT_GROUP_ICON, group_icons
- resource icons,\
- 1, LANG_NEUTRAL, icon_data1,\
- 2, LANG_NEUTRAL, icon_data2,\
- 3, LANG_NEUTRAL, icon_data3
- resource group_icons,\
- 1, LANG_NEUTRAL, main_icon
- ; Описание иконок разных размеров, объединенных в одну
- icon main_icon,\
- icon_data1, 'icon_16x16_32bit.ico',\
- icon_data2, 'icon_32x32_32bit.ico',\
- icon_data3, 'icon_48x48_32bit.ico'
Читать статью целиком »
Просмотров: 8219 | Комментариев: 5
Программное выключение монитора
08.02.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter

Программное выключение монитора
Выключить монитор из программы можно, но только если он совместим со стандартом EnergyStar. Об этом можно не беспокоиться, все современные мониторы удовлетворяют этому условию. Беспокоиться надо о другом. По непонятной причине с сайта на сайт упорно копируют один и тот же код на разных языках программирования, который якобы должен выключить монитор. Вот его вариант на Ассемблере:
Code (Assembler) : Убрать нумерацию
- ; ВНИМАНИЕ! Это НЕПРАВИЛЬНЫЙ код!!!
- invoke GetDesktopWindow
- invoke SendMessage, eax, WM_SYSCOMMAND, SC_MONITORPOWER, 0
Читать статью целиком »
Просмотров: 15032 | Комментариев: 20
Сортировка массива строк на Ассемблере
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
Читать статью целиком »
Просмотров: 18903 | Комментариев: 7
Рекурсивный обход дерева каталогов
19.01.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter

Рекурсивный обход дерева каталогов
Обход дерева каталогов является одной из классических прикладных задач на применение рекурсии. В Windows штатных API-функций для этого нет, поэтому поиск файлов выполняется при помощи пары API-функций FindFirstFile и FindNextFile. Совершенно непонятно, почему разработчики Windows не дали возможность точно настраивать критерии поиска, ограничившись только маской имени файла. Даже в MS-DOS для решения аналогичной задачи можно было задать по крайней мере атрибуты файлов, например для поиска только каталогов. Более расширенные возможности для поиска предоставляет API-функция FindFirstFileEx, но она доступна только в операционной системе Windows 2000 и выше.
Читать статью целиком »
Просмотров: 9481 | Комментариев: 2
Функции base64 на Ассемблере
09.01.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Алгоритм Base64 может использоваться в пользовательских почтовых приложениях, в качестве одного из уровней защиты шифрованием, для хранения двоичных данных и для решения многих других задачах. В большинстве языков высокого уровня используются штатные функции, в Ассемблере приходится все реализовывать самостоятельно.Алгоритм Base64 обратимый, то есть из закодированного текста можно в точности получить исходные данные. Начнем с функции кодирования.
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------------------------
- ; Функция кодирования Base64
- ;---------------------------------------------------------------
- ; Параметры:
- ; lpFrom - указатель на исходные данные
- ; lpTo - указатель на буфер для приема кодированных данных
- ; dSize - размер исходных данных
- ; Функция ничего не возвращает
- ;---------------------------------------------------------------
- proc base64_encode lpFrom:dword, lpTo:dword, dSize:dword
- pusha
- mov ebx,.base64
- mov esi,[lpFrom]
- mov edi,[lpTo]
- mov ecx,[dSize]
- or ecx,ecx
- jz .r3
- .encode_loop:
- lodsd
- mov edx,eax
- bswap edx
- xor eax,eax
- shld eax,edx,6
- shl edx,6
- xlatb
- stosb
- xor eax,eax
- shld eax,edx,6
- shl edx,6
- xlatb
- stosb
- dec ecx
- jz .r2
- xor eax,eax
- shld eax,edx,6
- shl edx,6
- xlatb
- stosb
- dec ecx
- jz .r1
- xor eax,eax
- shld eax,edx,6
- shl edx,6
- xlatb
- stosb
- dec esi
- dec ecx
- jnz .encode_loop
- jmp .r3
- .r2:
- mov al,'='
- stosb
- .r1:
- mov al,'='
- stosb
- .r3:
- xor eax,eax
- stosb
- popa
- ret
- .base64 db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
- db 'abcdefghijklmnopqrstuvwxyz'
- db '0123456789+/'
- endp
Читать статью целиком »
Просмотров: 6185 | Комментариев: 9


