
Быстрый поиск
Введите фрагмент названия статьи для поиска
Создание выпадающего списка (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
- ...
Читать статью целиком »
Просмотров: 12329 | Комментариев: 3
Преобразование строки в число
10.11.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Для конвертирования строки в число я использую две функции. Первая предназначена для конвертирования строки десятичных цифр в число:Code (Assembler) : Убрать нумерацию
- ;----------------------------------------------------------
- ; На входе: указатель на строку
- ; На выходе: EAX = число или 0 если не получилось
- ;----------------------------------------------------------
- proc str2dec lpStr:dword
- push ebx edx esi
- xor eax,eax
- mov esi,[lpStr]
- .str2dec_loop:
- movsx ebx,byte [esi]
- sub bl,'0'
- ; Для системы счисления с другим основанием замените следующую
- ; строчку на cmp bl,основание_системы
- cmp bl,10
- jnb .str2dec_ret
- ; Для системы счисления с другим основанием замените следующую
- ; строчку на imul eax,основание_системы
- imul eax,10
- add eax,ebx
- inc esi
- jmp .str2dec_loop
- .str2dec_ret:
- pop esi edx ebx
- ret
- endp
Читать статью целиком »
Просмотров: 17238 | Комментариев: 5
Установка и настройка Flat Assembler (FASM)
01.11.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter

Установка и настройка Flat Assembler (FASM)
Программирование на Ассемблере я начинал с Turbo Assembler (TASM) под MS-DOS, сейчас пишу на Flat Assembler (FASM) под Windows. Это очень удобный и мощный пакет для разработки, бесплатный для любого использования. Написан полностью на самом себе, исходники прилагаются. Мне он нравится тем, что позволяет хранить код и описания ресурсов в одном ASM-файле, поддерживает макросы, генерит чистый машинный код без всякой незаявленной самодеятельности, не требует лишней рутинной работы типа прописывания каждой задействованной функции в секцию импорта и еще множество приятных мелочей, облегчающих жизнь программисту. Единственным недостатком является отсутствие достаточного количества готовых исходников, например по сравнению с тем же MASM'ом, а портирование исходников с других платформ на FASM иногда вызывает затруднения. Но на мой взгляд портирование, в отличие от копирования, помогает гораздо лучше изучить язык. Несколько исходников-примеров есть в самом дистрибутиве FASM, еще несколько примеров можно скачать с офсайта или поискать в Интернете. Ответы на многие возникающие вопросы можно найти на официальном форуме FASM. Форум англоязычный, но на нем немало наших соотечественников. К новичкам на форуме относятся хорошо и отвечают даже на самые глупые вопросы.
Читать статью целиком »
Просмотров: 83703 | Комментариев: 57
Создание прозрачных окон в Windows
29.10.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Еще один простой в реализации, но красивый эффект для ваших программ - прозрачные диалоговые окна. Для этого надо, чтобы диалоговое окно было прописано в ресурсах или создавалось с расширенным стилем WS_EX_LAYERED, а при его инициализации вызывалась функция SetLayeredWindowAttributes. Значение коэффициента прозрачности может быть от 0 (полностью прозрачное окно) до 255 (непрозрачное окно). Рекомендуется значение 240-245, при этом эффект прозрачности уже заметен, а содержимое окна еще легко читается и не сливается с перекрываемыми окнами. Этой же функцией можно динамически менять прозрачность уже созданного окна, например чтобы создать эффект его плавного появления или исчезновения.Code (Assembler) : Убрать нумерацию
- ; Сегмент кода
- section '.code' code readable executable
- ...
- ; Процедура обработчика окна
- proc DialogProc hwnddlg,msg,wparam,lparam
- ...
- ; Инициализация окна?
- cmp [msg], WM_INITDIALOG
- je wminitdialog
- ; Закрытие окна?
- cmp [msg], WM_CLOSE
- je wmclose
- ...
- wminitdialog:
- ; Установить первоначальную прозрачность окна 245
- invoke SetLayeredWindowAttributes, [hwnddlg], 0, 245, LWA_ALPHA
- ...
- wmclose:
- ; Плавное исчезновение окна при его закрытии
- mov ecx,245
- fade_dialog:
- push ecx
- ; Установка нового атрибта прозрачности
- invoke SetLayeredWindowAttributes, [hwnddlg], 0, ecx, LWA_ALPHA
- ; Небольшая пауза
- invoke Sleep,2
- pop ecx
- loop fade_dialog
- ...
- ; Секция ресурсов
- section '.rsrc' resource data readable
- ; Описание диалогового окна в ресурсах.
- ; В расширенных стилях должен быть прописан атрибут "WS_EX_LAYERED"
- dialog demo, 'Demo', 70, 70, 190, 175,\
- WS_CAPTION + WS_POPUP + WS_SYSMENU + DS_MODALFRAME,\
- WS_EX_LAYERED
- ...
Читать статью целиком »
Просмотров: 11717 | Комментариев: 4
Вывод QWORD в виде десятичного числа
05.10.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Для преобразования и форматированного вывода 32-битных значений в ассемблере используется стандартная API-функция wsprintf, но она бесполезна при работе с большими числами, например QWORD (64 бита). Значит обойдемся совсем без использования API.Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------------
- ; Преобразование QWORD в десятичное число
- ; Параметры вызова:
- ; dwHigh - Старшее двойное слово
- ; dwLow - Младшее двойное слово
- ; lpBuff - указатель на буфер-приемник
- ;---------------------------------------------------
- proc bignum dwHigh:DWORD, dwLow:DWORD, lpBuff:DWORD
- pushad ; Сохранить все регистры
- mov eax,[dwLow] ; Младшее двойное слово
- mov edx,[dwHigh] ; Старшее двойное слово
- mov edi,[lpBuff] ; Указатель на буфер-приемник
- xchg esi,edx ; Сохранить старший dword
- mov ebx,10 ; Основание системы счисления
- xor ecx,ecx ; Счетчик десятичных цифр
- .bignum_1:
- xchg eax,esi ; Расчитать десятичную цифру
- xor edx,edx
- div ebx
- xchg esi,eax
- div ebx
- or dl,'0' ; Преобразовать результат в символ цифры
- push edx ; Сохранить цифру в стеке
- inc ecx ; Увеличить счетчик цифр
- or eax,eax ; Все преобразовали?
- jnz .bignum_1
- .bignum_2:
- pop eax ; Записать все цифры из стека в буфер
- stosb
- loop .bignum_2
- xor eax,eax ; Признак окончания строки
- stosb
- popad ; Восстановить все регистры
- ret ; Ворзврат из процедуры
- endp
Читать статью целиком »
Просмотров: 10458 | Комментариев: 4


