Образ мышления: Assembler
То, что не удается запрограммировать на Ассемблере, приходится паять
Образ мышления: Assembler - RSS-канал
Образ мышления: Assembler - Карта сайта
Задача на применение логических инструкций
16.12.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Когда-то кому-то помогал с решением задачи на ассемблере, формулировка задания была такая:
Дан массив из 5 байт. Рассматривая его как массив из восьми 5-битных слов, посчитать количество слов с четным числом единиц в слове.
Алгоритм хитровывернутый, комментарии специально не прописывал, чтобы тупая и ленивая школота не смогла объяснить преподу, откуда взялось такое решение и как оно работает.
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------------------------
- ; Задача на применение логических инструкций
- ;
- ; Дан массив из 5 байт. Рассматривая его как массив из восьми
- ; 5-битных слов, посчитать количество слов с четным числом
- ; единиц в слове.
- ;
- ; Решение: ManHunter / PCL
- ;---------------------------------------------------------------
- format PE GUI 4.0
- entry start
- include 'win32a.inc'
- ;---------------------------------------------------------------
- section '.data' data readable writeable
- xbytes db 00111000b ; Данные для задачки, взяты с потолка :)
- db 11111110b
- db 01010101b
- db 00001001b
- db 00000110b
- mask db 'Count: %i',13,10,13,10
- db '%i%i%i%i%i - %i%i%i%i%i - %i%i%i%i%i - %i%i%i%i%i',13,10
- db '%i%i%i%i%i - %i%i%i%i%i - %i%i%i%i%i - %i%i%i%i%i',13,10
- db 0
- title db 'Solution',0
- tmp rb 100
- ;---------------------------------------------------------------
- section '.code' code readable executable
- start:
- mov esi,xbytes+4
- loc_1:
- lodsb
- mov ecx,8
- loc_2:
- xor edx,edx
- test al,00000001b
- jz loc_3
- inc edx
- loc_3:
- push edx
- shr al,1
- loop loc_2
- dec esi
- dec esi
- cmp esi,xbytes
- jnb loc_1
- xor eax,eax
- xor esi,esi
- loc_4:
- xor edi,edi
- mov ecx,5
- loc_5:
- add edi,[esp+eax*4]
- inc eax
- loop loc_5
- test edi,edi
- jz loc_6
- test edi,1
- jnz loc_6
- inc esi
- loc_6:
- cmp eax,40
- jb loc_4
- invoke wsprintf,tmp,mask,esi
- add esp,12+(8*5*4)
- invoke MessageBox,HWND_DESKTOP,tmp,title,MB_OK
- invoke ExitProcess,0
- ;---------------------------------------------------------------
- section '.idata' import data readable writeable
- library kernel32,"KERNEL32.DLL",\
- user32,"USER32.DLL"
- include "apia\kernel32.inc"
- include "apia\user32.inc"
Читать статью целиком »
Просмотров: 5890 | Комментариев: 3
Обработка перетаскивания файлов (Drag'n'Drop)
10.12.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Если в вашем приложении используется обработка файлов, то кроме открытия через стандартные диалоги выбора файла и каталога, можно получать их из Проводника Windows перетаскиванием. Обработка перетаскивания файлов выполняется в два этапа. При инициализации диалогового окна приложения должна вызываться функция DragAcceptFiles. Параметр функции TRUE разрешает принятие файлов окном, а FALSE его запрещает, так что прием файлов можно регулировать динамически. Непосредственно прием файлов окном выполняется функцией DragQueryFile.Code (Assembler) : Убрать нумерацию
- ; Сегмент кода
- section '.code' code readable executable
- ...
- ; Процедура обработчика окна
- proc DialogProc hwnddlg,msg,wparam,lparam
- ...
- ; Инициализация окна
- cmp [msg],WM_INITDIALOG
- je wminitdialog
- ; Обработка перетаскивания файлов
- cmp [msg],WM_DROPFILES
- je wmdropfiles
- ...
- wminitdialog:
- ; Разрешить окну принимать файлы
- invoke DragAcceptFiles,[hwnddlg],TRUE
- jmp processed
- wmdropfiles:
- ; Обработка полученных файлов. Функция DragQueryFile возвращает имя
- ; файла с указанным индексом (нумерация индексов начинается с нуля).
- ; Для получения общего количества переданных файлов ее надо вызвать с
- ; индексом равным 0FFFFFFFFh
- invoke DragQueryFile,[wparam],0FFFFFFFFh,NULL,NULL
- ; В регистре EAX количество переданных файлов
- ; Перебрать по очереди все переданные окну файлы
- xor ecx,ecx
- process_file:
- push ecx eax
- ; Получить имя файла или каталога в буфер fname
- invoke DragQueryFile,[wparam],ecx,fname,100h
- ...
- ; Тут будет обработчик переданных файлов и каталогов
- ...
- pop eax ecx
- inc ecx
- cmp ecx,eax
- jne process_file
- ; Освободить дескриптор операции
- invoke DragFinish,[wparam]
- ...
После выполнения всех необходимых действий с файлом, надо освободить память, выделенную под файлы, при помощи функции DragFinish.
Читать статью целиком »
Просмотров: 5689 | Комментариев: 2
Окно поверх всех окон (Always On Top)
03.12.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Установка окна поверх всех других окон бывает удобна, когда надо привлечь внимание пользователя к важной информации, или окно с какими-либо данными должно находиться всегда перед глазами. Такое свойство окна можно прописать сразу в ресурсах, а можно изменять динамически, например при нажатии на кнопку-чекбокс "Always on top" или при изменении каких-нибудь внутренних настроек вашей программы.Для создания окна поверх всех других окон, оно должно быть описано в ресурсах с флагом DS_SYSMODAL. Для динамического изменения используется функция SetWindowPos с флагами SWP_NOMOVE и SWP_NOSIZE. Флаги нужны для того, чтобы не изменять размеры и положение окна.
Code (Assembler) : Убрать нумерацию
- ; Идентификатор чекбокса в ресурсах
- ID_ONTOP = 101
- ; Сегмент кода
- section '.code' code readable executable
- ...
- ; Процедура обработчика окна
- proc DialogProc hwnddlg,msg,wparam,lparam
- ; Обработка нажатия на кнопку-чекбокс
- cmp [wparam],BN_CLICKED shl 16 + ID_ONTOP
- je .ontop
- ...
- .ontop:
- ; Получить состояние чекбокса
- invoke IsDlgButtonChecked,[hwnddlg],ID_ONTOP
- cmp eax,BST_CHECKED
- ; По умолчанию будем считать что галочка поставлена
- mov eax,HWND_TOPMOST
- je @f
- ; Галочка не поставлена, убрать атрибут "поверх всех окон"
- mov eax,HWND_NOTOPMOST
- @@:
- ; Установить параметр окна "поверх всех окон", изменение размера
- ; и положения окна не производится, это установлено флагами
- invoke SetWindowPos,[hwnddlg],eax,0,0,0,0,SWP_NOMOVE+SWP_NOSIZE
- jmp .processed
- ...
- ; Секция ресурсов
- section '.rsrc' resource data readable
- ; Диалог описан со стилем DS_SYSMODAL - поверх всех окон
- dialog demonstration, 'Always on top Demo', 0, 0, 190, 55,\
- WS_CAPTION+WS_SYSMENU+DS_CENTER+DS_SYSMODAL
- ...
- ; Кнопка-чекбокс, которая будет управлять положением окна
- dialogitem 'BUTTON','Always on top', ID_ONTOP, 5, 150, 63, 13,\
- WS_VISIBLE+BS_AUTOCHECKBOX+BS_FLAT
- ...
Читать статью целиком »
Просмотров: 11906 | Комментариев: 3
Расчет хеша MD5 на Ассемблере
23.11.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Функция расчета хеша MD5 на Ассемблере. Готовых решений на FASM как всегда не было, пришлось портировать из MASM. Для работы процедуры в сегменте .data надо подготовить следующие данные:Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- ...
- ; Шаблоны функции wsprintf для перевода хеша в строковый вид,
- ; при необходимости можно оставить только какой-нибудь один
- szMD5Format1 db '%.8X%.8X%.8X%.8X',0 ; Для получения заглавных букв
- szMD5Format2 db '%.8x%.8x%.8x%.8x',0 ; Для маленьких букв в строке хеша
- stMD5Result:
- stdtA dd ? ; Переменные для получения и хранения
- stdtB dd ? ; результата хеширования
- stdtC dd ?
- stdtD dd ?
- stMD5Hash rb 33 ; Буфер для строки хеша в формате ASCIIZ
Читать статью целиком »
Просмотров: 10171 | Комментариев: 5
Создание выпадающего списка (Combobox)
13.11.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Выпадающий список ComboBox описывается через ресурсы, но заполняется элементами отдельно, на этапе инициализации родительского окна. Для удобства заполнения выпадающих списков я написал и использую такой код.Code (Assembler) : Убрать нумерацию
- ; Идентификатор списка в ресурсах
- ID_LIST = 104
- ; Сегмент данных
- section '.data' data readable writeable
- ; Элементы списка в формате ASCIIZ
- items db 'item 0',0
- db 'item 1',0
- db 'item 2',0
- db 'item 3',0
- db 0 ; Признак окончания списка
- CtrlID dd ? ; Хэндл списка
- ; Сегмент кода
- section '.code' code readable executable
- ...
- ; Процедура обработчика окна
- proc DialogProc hwnddlg,msg,wparam,lparam
- ...
- ; Инициализация окна?
- cmp [msg], WM_INITDIALOG
- je wminitdialog
- ...
- wminitdialog:
- ...
- ; Заполнение списка строками
- invoke GetDlgItem,[hwnddlg],ID_LIST
- mov [CtrlID],eax
- mov esi,items ; Указатель на список элементов
- fill_list:
- invoke lstrlen,esi ; Длина строки
- or eax,eax
- jz fill_end
- push eax
- ; Добавить строку в список
- invoke SendMessage, [CtrlID], CB_ADDSTRING, 0, esi
- pop eax
- add esi,eax ; Следующий элемент списка
- inc esi
- jmp fill_list
- fill_end:
- ; Установить пункт ID=2 дефолтным, нумерация ID начинается с 0
- ; По умолчанию дефолтный первый пункт с ID=0
- invoke SendMessage, [CtrlID], CB_SETCURSEL, 2, FALSE
- ...
- ; Секция ресурсов
- section '.rsrc' resource data readable
- ...
- ; Определение выпадающего списка в ресурсах
- ; 200 - максимальный вертикальный размер раскрываемой области списка,
- ; высота самого элемента расчитывается автоматически и в ресурсах
- ; изменить ее невозможно
- dialogitem 'COMBOBOX', '', ID_LIST, 2, 10, 150, 200,\
- WS_VISIBLE+CBS_DROPDOWNLIST+CBS_HASSTRINGS+WS_VSCROLL
- ...
Читать статью целиком »
Просмотров: 11997 | Комментариев: 3