· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.PROJECTS —› FASM macro library

. 1 . 2 . 3 . 4 . 5 . >>

Посл.отвђт Сообщенiе


Дата: Июл 20, 2004 20:32:07 · Поправил: Безпощадный даос

Привет всем!

После некоторых эмпирических опытов :) накопились у меня кое-какие макросы для FASM.
(К тому же надоело раскидывать их по топикам - потом искать не удобно)

Поэтому решил создать новую тему.
Возможно у кого-то ещё есть интересные макросы которыми есть желание поделиться.


Для начала, некоторые возмжности библиотечки:
(пока она далека от завершения, но пользоваться уже можно :)

  1. Нет необходимости в INVOKE, как для вызова WinAPI функций, так и своих собственных. Просто "ExitProcess 0" (хотя есть макрос CALL иммитирующий её работу)
  2. Вызовы функций могут быть вложенными (например: MessageBox GetForegroundWindow,@T 'String',@T 'GetCaption', MB_OK)
  3. Собственные функций поддерживают передачу параметров через стек (STDCALL & CDECL) и/или в регистрах (FASTCALL). При вызове функций автоматически используется PUSH или MOV (возможно и LEA) в зависимости от того, как объявлен аргумент при определении функций.
  4. Функций поддерживают только ESP-based стековый фрейм (локальные переменные). Это освобождает EBP для других целей. При компиляции выполняются некоторые проверки сбалансированности стека (соответствие PUSH/POP и т.п.)
  5. Макросы для объявления псевдолокальных данных. Т.е. объявления данных можно раскидывать по коду, они собираются в кучу (возможно, отдельную секцию) при компиляции. Имена меток модифицируются - при доступе внутри PROC/ENDP можно использовать локальное имя (начинающееся с точки), для доступа из ругого места необходимо добавлять глобальную метку (имя PROC) -префикс
  6. Возможности создания минимальной секции импорта (только Kernell32.GetProcessAddress) - остальные dll подгружаются при запуске прогораммы и выполняется динамическая линковка.
  7. макросы для создания простых меню (с автоматическим созданием акселераторов и обработчика)
  8. шаблонные функции для работы с простыми окошками


В аттаче есть несколько примеров использования библиотечки.
Рекомендуется поэксперементировать с ними и посмотреть под отладчиком/дизассемблером.

Для компиляции необходимо добавить пути к папкам "#Inc" и "#Lib" в %INCLUDE%.

Часть 1
Часть 2


обновление Авг 8, 2004


Дата: Июл 21, 2004 03:36:27

Ой! А где здесь ассемблер? =)


Дата: Июл 21, 2004 04:31:59

jekyll
Здесь


Дата: Июл 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]
аттач убран, новая версия далее.

. 1 . 2 . 3 . 4 . 5 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.101