Mikl__, спасибо, очень интересно. Только одно "но": Код (Text): jmp short a1 ... a1: ret Для чего это?
По умолчанию почти все ассемблеры (кроме NASM, YASM) создают код двухбайтного jmp если метка лежит на растоянии -128/+127 байт, если растояние длинее - формируется 5 байтовый код jmp. При использовании short и при появлении сообщений, что данная метка находится на растоянии более +127/-128 байт - это сигнал автору пересмотреть алгоритм или расположение меток - короче, один из способов писать более короткий код
Только сейчас заметил тему! Mikl__ на самом деле очень интересно и полезно всё что ты написал! (хоть половину и не понял ) Mikl__ единственное не пойму... зачем тебе переписывать уроки Iczelionа? Помоему ты пишешь ничуть не хуже. Попробуй написать цикл статей (уроков) для начинающих, наподобие Iczelionа. Если есть у тебя желание и время набери новичков в асме (например таких как я ) и пиши урок. Потом эту статью читают новички. Каждый говорит что не понятно. Ну и затем статья правиться так, пока все моменты для понимания урока не будут учтены. Как мне кажется это наиболее правильный и успешный путь написания статьи. Например уроки Iczelionа мне не все понятны... приходится копать глубже в дополнительной литературе, которая конечно же не указана в уроке. А не понятны они по большей части потому, что автор при написании не учел знает ли новичок (ученик) определенный момент или пункт в статье, необходимый для понимания всего урока.
Это понятно. Только вот думаю: почему бы на месте Код (Text): jmp short a1 сразу не написать Код (Text): ret
AssemblerIA64 1) Да, окно я намеренно закрасил синим 2) То что касается замены jmp short a1 -> на ret в данном случае ret не 0C3h а макрос, который в коде программы разворачивается в Код (Text): С9 (leave) C21000 (retn 10h) ; поэтому заменять двухбайтовый jmp short на четырехбайтовый leave/retn 10h ; я посчитал нецелесообразным Shoorup, latent В принципе заканчиваю перевод уроков Iczelionа на GoAsm, FASM, NASM, YASM, WASM, lzasm но это не уроки а "вариации на тему" -- поэтому пишите в эту тему, о чем бы хотелось
Mikl__, мне кажется, стоит переписать примеры с диалогами: одной-единственной кнопки явно недостаточно, диалог ведь подразумевает навигацию по контролам. Кстати, у Iczelion-а с диалогами прокол на проколе, постарайтесь не повторить
_basmp_ от masm отличает то что в masm call _imp__proc а в wasm call __imp__proc самый удивительный синтаксис у GoAsm например dec eax,ebx развернется в dec eax/dec ebx , при джампах необходимо указывать jz >метка (короткий переход к метке вперед) или jz <<метка (дальний переход к метке назад)
Mikl__, то есть в wParam - дескриптор на контекст окна? Код (Text): @@WM_CTLCOLORSTATIC: push 32C8C8h push wParam call _imp__SetTextColor@8 push 0FF0000h push wParam call _imp__SetBkColor@8 push NULL_BRUSH call _imp__GetStockObject@4
Mikl__, тогда зачем: Код (Text): ;WNDCLASSA ----------------------------------------------- ... hbrBackground dd COLOR_BTNFACE+1;Фон нашего окна ... ;---------------------------------------------------------- ?
В первых строчках Код (Text): push 0FF0000h call _imp__CreateSolidBrush@4 mov [edi].hbrBackground,eax Цвет всего окна определяется, как синий. Строка Код (Text): ;WNDCLASSA ----------------------------------------------- ... hbrBackground dd COLOR_BTNFACE+1;Фон нашего окна это останки от предыдущего шаблона, правильнее конечно "hbrBackground dd ?" Надпись выводится как STATIC, поэтому цвет текста и фона под ним определен в Код (Text): @@WM_CTLCOLORSTATIC: push 32C8C8h push wParam call _imp__SetTextColor@8 push 0FF0000h push wParam call _imp__SetBkColor@8 push NULL_BRUSH call _imp__GetStockObject@4 a1: ret
Mikl__, может в уроке №5 WndProc написать лучше так: Код (Text): ; ------------ [Procedure WndProc] ------------------------------------------------ ; Обработка сообщений, посылаемых Windows нашему приложению ; --------------------------------------------------------------------------------- WndProc: cmp dword ptr [esp+8], WM_DESTROY je @@Destroy cmp dword ptr [esp+8], WM_CTLCOLORSTATIC je @@CtlColorStatic jmp _imp__DefWindowProcA@16 ; ---- [обработка WM_DESTROY] -------------------- @@Destroy: push 0 call _imp__PostQuitMessage@4 ret 10h ; ---- [обработка WM_CTLCOLORSTATIC] ------------ @@CtlColorStatic: push 0F37B0h ; Кирпичный цвет текста push dword ptr [esp+16] call _imp__SetTextColor@8 push 0FF0000h ; Синий фон push dword ptr [esp+16] call _imp__SetBkColor@8 push NULL_BRUSH ; Пустая кисточка call _imp__GetStockObject@4 ret 10h