Образ мышления: Assembler
То, что не удается запрограммировать на Ассемблере, приходится паять
Образ мышления: Assembler - RSS-канал
Образ мышления: Assembler - Карта сайта
Запись числа римскими цифрами на Ассемблере
18.09.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Запись числа римскими цифрами на Ассемблере
Задачки на запись натурального числа римскими цифрами очень часто встречаются на различных олимпиадах по программированию. Я решил нарисовать свой вариант решения задачи на Ассемблере.
Натуральные числа записываются при помощи повторения этих цифр. При этом применяется следующее базовое правило: одна и та же букво-цифра не может повторяться в записи числа более 3-х раз подряд. Для этого введены дополнительные двухбуквенные комбинации и, если меньшая букво-цифра стоит перед большей, то меньшая вычитается из большей. В табличке это наглядно видно. Но ограниченный набор букво-цифр приводит к тому, что максимальное число, которое можно записать базовым набором римских цифр, не может превышать десятичного числа 3999 (MMMCMXCIX). Также в римской записи нет нулевого значения, отрицательных и дробных чисел.
Читать статью целиком »
Просмотров: 786 | Комментариев: 0
Анимация окон с помощью функции AnimateWindow
16.09.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Когда-то давно я показывал, как можно реализовать анимацию окна вручную. Сейчас покажу, как подобная анимация делается штатными функциями Windows, а точнее одной единственной функцией AnimateWindow. Но сперва некоторое количество констант, которые используются в программе, но про которые не знает FASM.Code (Assembler) : Убрать нумерацию
- AW_HOR_POSITIVE = 0x00000001
- AW_HOR_NEGATIVE = 0x00000002
- AW_VER_POSITIVE = 0x00000004
- AW_VER_NEGATIVE = 0x00000008
- AW_CENTER = 0x00000010
- AW_HIDE = 0x00010000
- AW_ACTIVATE = 0x00020000
- AW_SLIDE = 0x00040000
- AW_BLEND = 0x00080000
Code (Assembler) : Убрать нумерацию
- cmp [msg],WM_INITDIALOG
- je wminitdialog
- cmp [msg],WM_CLOSE
- je wmclose
- ...
- wminitdialog:
- ; Плавно развернуть окно из центра
- invoke AnimateWindow,[hwnddlg],300,AW_CENTER+AW_ACTIVATE
- ...
- wmclose:
- ; Плавно потушить окно при закрытии
- invoke AnimateWindow,[hwnddlg],300,AW_BLEND+AW_HIDE
- ...
Читать статью целиком »
Просмотров: 684 | Комментариев: 0
Создание комбинированных иконок
18.08.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Создание комбинированных иконок
Комбинирование иконок применяется в Windows очень часто. Самый яркий пример - маленькая иконка со стрелочкой поверх основной иконки приложения на ярлыках. Или иконки расшаренных дисков и каталогов. В приложениях такой трюк тоже можно использовать, когда интерфейс предполагает большое количество кнопок или графических STATIC'ов с разными состояниями. Вместо того, чтобы таскать в ресурсах кучу иконок под каждое состояние каждого элемента интерфейса, достаточно хранить базовый набор иконок и маленькие иконки-оверлеи, а затем их динамически комбинировать.
Читать статью целиком »
Просмотров: 512 | Комментариев: 4
Как получить список экспортируемых функций DLL
10.08.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня разберем, как получить список экспортируемых функций динамических библиотек. Лично я использую эти данные для формирования баз подсветки синтаксиса и автодополнения редактора Sublime Text. Наверняка можно придумать и другие применения.Формат PE-файлов, как и таблицы экспорта, неплохо документирован на многих языках, эту информацию легко найти в интернетах. Несмотря на это, FASM про нужные нам структуры ничего не знает. Это привычное явление.
Code (Assembler) : Убрать нумерацию
- struct LOADED_IMAGE
- ModuleName dd ?
- hFile dd ?
- MappedAddress dd ?
- FileHeader dd ?
- LastRvaSection dd ?
- NumberOfSections dd ?
- Sections dd ?
- Characteristics dd ?
- fSystemImage db ?
- fDOSImage db ?
- fReadOnly db ?
- Version db ?
- Links rd 2
- SizeOfImage dd ?
- ends
- struct IMAGE_EXPORT_DIRECTORY
- Characteristics dd ?
- TimeDateStamp dd ?
- MajorVersion dw ?
- MinorVersion dw ?
- Name dd ?
- Base dd ?
- NumberOfFunctions dd ?
- NumberOfNames dd ?
- AddressOfFunctions dd ?
- AddressOfNames dd ?
- AddressOfNameOrdinals dd ?
- ends
- IMAGE_DIRECTORY_ENTRY_EXPORT = 0
Читать статью целиком »
Просмотров: 764 | Комментариев: 4
Пользовательская фильтрация в функции SHBrowseForFolder
16.07.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Функцию SHBrowseForFolder я оттюнинговал уже давно, казалось бы уже все, дальше некуда. Ан нет, есть куда. Сегодня разберем еще одну замечательную возможность этой функции, а именно пользовательскую фильтрацию. С ее помощью вы можете выводить в древовидный список только те папки и файлы, которые считаете нужным. Это будет очень полезно, когда надо дополнительно подстраховать пользователя от возможной ошибки.Для реализации фильтрации используется технология COM, а это значит, что нам потребуется некоторое количество GUID'ов, структур и констант, которые не знает FASM.
Code (Assembler) : Убрать нумерацию
- ; GUID {00000000-0000-0000-C000-000000000046}
- IID_IUnknown \
- dd 000000000h
- dw 00000h
- dw 00000h
- db 0C0h, 000h, 000h, 000h, 000h, 000h, 000h, 046h
- ; GUID {C0A651F5-B48B-11D2-B5ED-006097C686F6}
- IID_IFolderFilterSite \
- dd 0C0A651F5h
- dw 0B48Bh
- dw 011D2h
- db 0B5h, 0EDh, 000h, 060h, 097h, 0C6h, 086h, 0F6h
- ; IID_IFolderFilterSite Interface
- struct IFolderFilterSite
- ; IUnknown
- QueryInterface dd ? ; 000h
- AddRef dd ? ; 004h
- Release dd ? ; 008h
- ; IFolderFilterSite
- SetFilter dd ? ; 00Ch
- ends
- ; GUID {9CC22886-DC8E-11D2-B1D0-00C04F8EEB3E}
- IID_IFolderFilter \
- dd 09CC22886h
- dw 0DC8Eh
- dw 011D2h
- db 0B1h, 0D0h, 000h, 0C0h, 04Fh, 08Eh, 0EBh, 03Eh
- ; IID_IFolderFilter Interface
- struct IFolderFilter
- ; IUnknown
- QueryInterface dd ? ; 000h
- AddRef dd ? ; 004h
- Release dd ? ; 008h
- ; IFolderFilter
- ShouldShow dd ? ; 00Ch
- GetEnumFlags dd ? ; 010h
- refcount dd ?
- ends
- ; IID_IShellFolder Interface
- struct IShellFolder
- ; IUnknown
- QueryInterface dd ? ; 000h
- AddRef dd ? ; 004h
- Release dd ? ; 008h
- ; IShellFolder
- ParseDisplayName dd ? ; 00Ch
- EnumObjects dd ? ; 010h
- BindToObject dd ? ; 014h
- BindToStorage dd ? ; 018h
- CompareIDs dd ? ; 01Ch
- CreateViewObject dd ? ; 020h
- GetAttributesOf dd ? ; 024h
- GetUIObjectOf dd ? ; 028h
- GetDisplayNameOf dd ? ; 02Ch
- SetNameOf dd ? ; 030h
- ends
- struct STRRET
- uType dd ?
- cStr rb 260
- ends
- SHCONTF_FOLDERS = 0x00000020
- SHCONTF_NONFOLDERS = 0x00000040
- SFGAO_FOLDER = 0x20000000
- SHGDN_FORPARSING = 0x8000
- BFFM_IUNKNOWN = 5
- ; Флаги открытия диалога
- BIF_RETURNONLYFSDIRS = 1
- BIF_DONTGOBELOWDOMAIN = 2
- BIF_BROWSEINCLUDEFILES = 0x00004000
- BIF_NEWDIALOGSTYLE = 0x00000040
Читать статью целиком »
Просмотров: 420 | Комментариев: 2