Образ мышления: Assembler
То, что не удается запрограммировать на Ассемблере, приходится паять
Образ мышления: Assembler - RSS-канал
Образ мышления: Assembler - Карта сайта
Преобразование числа в строку с разделением на разряды
17.01.2016 | Категория: Образ мышления: Assembler | Автор: ManHunter
Преобразование числа в строку с разделением на разряды
Если вы работаете с большими десятичными числами, то наверняка согласитесь, что число с разделением на разряды (то есть с группировкой по три символа: тысячи, миллионы и так далее) воспринимается гораздо лучше, чем просто последовательность цифр. Так проще выявлять ошибки или, например, с одного взгляда можно оценить порядок числа.
Читать статью целиком »
Просмотров: 5152 | Комментариев: 9
Как проверить соответствие файла PE-формату без запуска
01.12.2015 | Категория: Образ мышления: Assembler | Автор: ManHunter
Как проверить соответствие файла PE-формату без запуска
На форуме EXEL@B встретилась интересная тема по проверке является ли файл корректным PE-файлом, но без его запуска. Статическая проверка по типовым полям PE-заголовка не дает гарантии корректности, так как можно просто приписать к валидному заголовку кусок мусора или испортить его содержимое. Придется как минимум проверить соответствие размера файла суммарному размеру секций, а более тщательные проверки потребуют самостоятельного разбора секций импорта и экспорта, TLS, релоков и еще много чего. Проще всего доверить подобные проверки самой системе.
Читать статью целиком »
Просмотров: 4033 | Комментариев: 7
Как на Ассемблере сделать скриншот отдельного окна
02.11.2015 | Категория: Образ мышления: Assembler | Автор: ManHunter
Одна из интересных задач при работе с окнами - захват и сохранение скриншота выбранного окна или всего экрана целиком. Во многих руководствах по программированию для этого рекомендуют использовать функцию BitBlt.Code (Assembler) : Убрать нумерацию
- ; Захват отдельного окна через BitBlt
- invoke GetWindowDC,[hWnd]
- mov [windowDC],eax
- invoke CreateCompatibleDC,[windowDC]
- mov [newDC],eax
- ; Создать пустой битмап для скриншота
- invoke CreateCompatibleBitmap,[windowDC],[window_width],[window_height]
- mov [hBitmap],eax
- invoke SelectObject,[newDC],[hBitmap]
- ; Флаг для захвата полупрозрачных окон
- CAPTUREBLT = 0x40000000
- invoke BitBlt,[newDC],0,0,[window_width],[window_height],[windowDC],\
- 0,0,SRCCOPY+CAPTUREBLT
- ; Теперь в [hBitmap] находится изображение (Bitmap) окна
Читать статью целиком »
Просмотров: 4469 | Комментариев: 8
Автогенерация имени файла при наличии дублей
26.09.2015 | Категория: Образ мышления: Assembler | Автор: ManHunter
При разработке одной из своих программ передо мной встала задача сохранения файлов, но не просто так, а чтобы имя файла автоматически изменялось, если такой файл уже существует. С подобной задачей очень хорошо справляются менеджеры закачек и браузеры, в случае совпадения дополняя имя нового файла числовым индексом. В результате у меня получилась вот такая функция:Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------------------------
- ; Функция автогенерации имени файла
- ;---------------------------------------------------------------
- ; lpOldName - указатель на проверяемое имя файла
- ; lpNewName - указатель на доступное имя файла
- ;---------------------------------------------------------------
- proc generate_filename lpOldName:DWORD, lpNewName:DWORD
- locals
- fname dd ?
- fext dd ?
- filename rb MAX_PATH
- buff rb MAX_PATH
- idx dd ?
- endl
- pusha
- ; Получить полный путь к файла и указатель на имя
- lea edi,[filename]
- lea eax,[fname]
- invoke GetFullPathName,[lpOldName],MAX_PATH,edi,eax
- ; Проверить наличие файла или каталога
- invoke PathFileExists,edi
- or eax,eax
- ; Файла нет, сразу вернуться
- jz .loc_use_filename
- ; Индекс для автогенерации имени файла
- mov [idx],1
- ; Поискать расширение в названии файла
- invoke lstrlen,edi
- add edi,eax
- mov [fext],edi
- std
- mov ecx,edi
- sub ecx,[fname]
- mov al,'.'
- repne scasb
- cld
- or ecx,ecx
- jz @f
- ; Расширение найдено
- inc edi
- mov byte [edi],0
- inc edi
- mov [fext],edi
- @@:
- ; Сгенерировать имя файла с индексом
- lea edi,[buff]
- lea ebx,[filename]
- invoke wsprintf,edi,.mask,ebx,[idx],[fext]
- add esp,20
- ; Проверить наличие файла или каталога
- invoke PathFileExists,edi
- or eax,eax
- ; Файла нет, использовать это имя
- jz .loc_use_filename
- ; Следуюший номер счетчика
- inc [idx]
- jmp @b
- .loc_use_filename:
- ; Скопировать имя файла в буфер-приемник
- invoke lstrcpy,[lpNewName],edi
- popa
- ret
- ; Маска для автогенерации имени файла
- .mask db '%s (%i).%s',0
- endp
Читать статью целиком »
Просмотров: 2659 | Комментариев: 13
Отслеживание изменений в каталоге на Ассемблере
17.08.2015 | Категория: Образ мышления: Assembler | Автор: ManHunter
Отслеживание изменений в каталоге на Ассемблере
Одна из интересных задач, с которой рано или поздно сталкивается системный программист - это отслеживание изменений в определенном каталоге или на всем диске целиком. Это может быть что-то типа файлового монитора или какого-нибудь программного триггера, срабатывающего при появлении или изменении определенного файла. Не стоит забывать и борьбу со всякой хитрозакрученной шароварой, когда надо точно и быстро отследить, в какой файл записывается регистрационная информация или триальный счетчик. В этой статье я расскажу, как сделать подобный монитор изменений в каталогах на чистом Ассемблере.
Читать статью целиком »
Просмотров: 5424 | Комментариев: 10