|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июл 20, 2004 20:32:07 · Поправил: Безпощадный даос Привет всем! После некоторых эмпирических опытов :) накопились у меня кое-какие макросы для FASM. (К тому же надоело раскидывать их по топикам - потом искать не удобно) Поэтому решил создать новую тему. Возможно у кого-то ещё есть интересные макросы которыми есть желание поделиться. Для начала, некоторые возмжности библиотечки: (пока она далека от завершения, но пользоваться уже можно :)
В аттаче есть несколько примеров использования библиотечки. Рекомендуется поэксперементировать с ними и посмотреть под отладчиком/дизассемблером. Для компиляции необходимо добавить пути к папкам "#Inc" и "#Lib" в %INCLUDE%. Часть 1
Часть 2
обновление Авг 8, 2004 |
|
|
Дата: Июл 21, 2004 03:36:27 Ой! А где здесь ассемблер? =) |
|
|
Дата: Июл 21, 2004 04:31:59 |
|
|
Дата: Июл 21, 2004 11:26:44 pas Я о том, что S_T_A_S_ изобретает свой язык, чем-то на Си похожий =) |
|
|
Дата: Июл 21, 2004 12:03:57 Молодец Стас. Реальное продвижение на макроуровне, побольше бы таких спецов... jekyll Я о том, что S_T_A_S_ изобретает свой язык, чем-то на Си похожий =) При чем сдесь С? Правильным путем идет товарищ Стас. Ассемблер не только должен давать полный контроль над генерируемым кодом на уровне инструкций но и быть легким в использовании. Вот для легкости использования и служит макросистема компилятора, которая позволяет подстраивать програмисту язык под себя и свои потребности. Хотя что это я? Не буду вступать в полемику по-поводу целесообразности написания сложных макросов. По этому поводу сдесь уже и так много копий поломано. В аттаче - мои макросы. Не доделанные, не документированные, не все, но зато рабочие и, смею думать, интересные. Вот пример использования в программе: include system include Windows uses kernel32,user32 ;===================================================================== ========== proc DialogProc ,hDlg,uMsg,wParam,lParam begin mov eax,[uMsg] cmp [uMsg],WM_COMMAND je .command cmp eax,WM_CLOSE je .close cmp eax,WM_INITDIALOG je .create .default: xor eax,eax ret .return:call SetWindowLongA ,[hDlg],DWL_MSGRESULT,eax mov eax,TRUE ret .close: call EndDialog ,[hDlg],eax jmp .default .create: jmp .return .command: cmp [wParam],WM_CLOSE je .close jmp .default endp ;--------------------------------------------------------------------- ---------- WinMain:try call DialogBoxParamA ,<call GetModuleHandleA,NULL>,1,NULL,DialogProc,NULL ;about finally call ExitProcess ,eax end. А это - пример модуля kernel32 ; Define API decoration for direct importing of DLL references. WINADVAPI fix DECLSPEC_IMPORT WINBASEAPI fix DECLSPEC_IMPORT ZAWPROXYAPI fix DECLSPEC_IMPORT INVALID_HANDLE_VALUE =-1 INVALID_FILE_SIZE =0xFFFFFFFF INVALID_SET_FILE_POINTER=-1 INVALID_FILE_ATTRIBUTES =-1 MoveMemory fix RtlMoveMemory WINBASEAPI WINAPI HeapLock,4 WINBASEAPI WINAPI HeapUnlock,4 WINBASEAPI WINAPI HeapWalk,8 WINBASEAPI WINAPI HeapSetInformation,16 WINBASEAPI WINAPI HeapQueryInformation,20 ... Кстати, а почему бы нам на васме не заиметь отдельную ветку для фасма на русском? А то на flatassembler.net не очень удобно аглицким общаться... тем более сколько людей его не знают :( _1150411947__macro.rar |
|
|
Дата: Июл 21, 2004 14:41:49 Uri При чем сдесь С? Правильным путем идет товарищ Стас. А кто спорит? Кстати, а почему бы нам на васме не заиметь отдельную ветку для фасма на русском? Мысль грамотная, но что скажут хозяева? Aquila, ты где? WASM.MASM - WASM.FASM? Думаю, что скажут пишите в WASM.ASSEMBLER и баста. =( |
|
|
Дата: Июл 21, 2004 19:04:25 Uri Я вижу, у тебя используется uses, для указания из каких dll нужно импортировать ф-ции. Я тоже пошёл по такому пути, но kernel32 импортируется по умолчанию для консольных приложений (!CONSOLE). А если гуёвые (!GUI) - то ещё и user32. Делает это всё макрос LIB. Можно, кстати, пытаться импортировать одну либу сколько угодно раз - ничего страшного не произойдёт :) При этом определяются и макросы типа ExitProcess. Кстати, макросы еtry / finally есть ещё здесь, но тот вариант imho требует некоторой обработкинапильником :). > WASM.MASM - WASM.FASM? Да зачем? На самом деле многие топики (за последнее время) где в названии фигурируют проблемы FASM, на самом деле с FASM никак не связанны. А потом будет WASM.FASM.WINDOWS, WASM.FASM.*NIX =) |
|
|
Дата: Июл 21, 2004 19:06:26 · Поправил: S_T_A_S_ |
|
|
Дата: Июл 21, 2004 19:12:09 S_T_A_S_ Я тоже пошёл по такому пути, но kernel32 импортируется по умолчанию для консольных приложений Хм. действительно. Согласен, надо засунуть в дефолт. некоторой обработкинапильником :) Еще обработаем. Только мне пока большего чем есть не надо. „WASM.MASM - WASM.FASM?“ Возможно ты и прав. Сдесь действительно мало людей, которые фасмом пользуются :( А скорее всего потому, что их учителя и преподаватели не могут учиться новому, и учат людей тасму... А вообще у тебя очень классные макросы - из них можно столько идей взять, столько интересных решений! fasm forever! |
|
|
Дата: Июл 21, 2004 19:21:30 Да, маленькое такое добавление. Я собрался писать макросы для обьявления вложенных процедур с возможностью доступа к локальным переменным родительских (а ля паскаль). Если есть что-либо где-либо подобное - прошу ткнуть носом. На flatassembler.net не нашел. |
|
|
Дата: Июл 21, 2004 23:39:16 Хм.. таких я не встречал :( Теоретически такие макросы думаю возможны, т.к. в стандартных макросах локальные переменные в стеке (точнее, их смещения от "ebp-..size") имеют глобальную область вилимости. Это значение нужно просто прибавить к (количеству аргументов текущей ф-ции)*4 + некоторая константа. Хотя я не знаю как это работает в паскале, возможно просто вычисляется адрес посредством LEA, и передаётся в качестве параметра в вызываемую подпрограмму? |
|
|
Дата: Июл 22, 2004 07:26:21 Возник такой вопрос, а как вы обращаетесь с большими константами, а-ля 64бита? Понятно, что в invoke они пойдут по частями, а как фасмовый препроцессор их распознает? Допустим есть константа aa equ 0FFFFFFFFFFFFFFFFh. Как быть? |
|
|
Дата: Июл 22, 2004 17:28:14 jekyll В каком смысле? поставил вместо equ = компилятор пргоглотил и не поперхнулся. С equ такая же история. |
|
|
Дата: Июл 23, 2004 01:25:44 pas Компилятор и в equ проглотит =) Ну смотри: someconst equ 0FFFFFFFFFFFFFFFFh invoke SomeProc,a,b,someconst Так вот как например модернизировать invoke, чтобы он врубался, что это int64 или там int128? |
|
|
Дата: Июл 23, 2004 09:49:38 · Поправил: S_T_A_S_ jekyll > Так вот как например модернизировать invoke, чтобы он врубался, что это int64 или там int128? Для данного конкретного случая такое можно сделать, а вот как быть на счёт int64 0 ? Думаю, нужно делать прототипы для каждой ф-ции, где определять тип аргументов. У меня пока это реализовано для определения типа регистровый / стековый параметр, вот с размером пока не знаю как сделать. А вообще, Black_mirror выкладывал макросы для работы с OpenGL Заодно, новая версия инклудов. Исправлены ошибки и довольно сильно изменена логика. Теперь символ @ не нужен, можно просто указывать имя ф-ции. Если же необходимо передать в качестве параметра алрес какой-то ф-йии, то используется dword procname Так же убрана ADDR, теперь используется LEAX, LEBX,.. для явного указания регистра. Эти команды не такие умные как ADDR, тип аргумента не определяют, а используют LEA+push безусловно. include 'ext.fi'
!GUI
ExitProcess \
<MessageBox \
GetForegroundWindow, \
@T "Hi! I'm the example program!", \
@T "Win32 Assembly", \
MB_OK>
!END
[edit] аттач убран, новая версия далее. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.101 |