fasm dll

ФОРМАТ МОДУЛЯ
~~~~~~~~~~~~~
modulename!
asmbody
end

- компилируется блок ассемблерных функций asmbody,
- в результате получается модуль по имени modulename
Внимание: первой строкой в объявлении asmfunc() ОБЯЗАТЕЛЬНО должно идти УНИКАЛЬНОЕ modulename с обязательным ! в конце.
- при вызове полученой функции передаваемые параметры (объявлять не обязательно), преобразовываются следующим образом:
строка - в указатель на строку (32 бит)
вещественное - в целое знаковое (32 бит)
все остальные - в целые знаковые (32 бит)
параметры находятся в:
[ebp] - общее количество параметров n
[ebp+4] - параметр 1
[ebp+8] - параметр 2
...
[ebp+4*n] - параметр n
Внимание: ebp находится не в вершине стека, при задании стековых переменных требуется осторожность!

Внутри asmbody можно применять специальные команды форматирования для получения доступа к переменным и функциям в других модулях и разрешеня доступа определенного типа из других модулей и осмовной программы к переменным и функциям в данном модуле.



СПЕЦИАЛЬНЫЕ КОМАНДЫ ФОРМАТИРОВАНИЯ
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Первой строкой в объявлении модуля ОБЯЗАТЕЛЬНО должно идти УНИКАЛЬНОЕ modulename с обязательным ! в конце.

Для поддержки взаимодействия модулей кроме стандартных команд существуют следующие дополнительные:

Дополнительные команды:

getorg - помещает в eax адрес начала модуля. При компиляции все абсолютные смещения считаются от начала модуля.

member "membname","membtype","access" - объявляет доступную извне метку. При этом:
membname - имя метки. Уникальное в пределах модуля.
membtype - тип метки. Строка где каждый символ:
s - строка (lp ASCIIZ)
f - функция
r - дробное с плавающей точкой (64 бита)
u - беззнаковое (по умолчанию)
s - знаковое
q - целое (64 бита)
d - целое (32 бита)
w - целое (16 бит)
b - целое (8 бит)
access - доступ. Строка где каждый символ:
r - доступно для чтения
w - доступно для записи
x - доступно для вызова. Только для функций (тип 'f').
Единственный возможный для функций тип доступа.

getmodvar "modulename","membname","membtype" - помещает в eax или в st(0), если вещественное, значение или адрес начала, если строка, переменной membname в модуле modulename.
Модуль должен быть загружен, в нем должна быть объявлена внешняя доступная для чтения переменная membname (member "membname","membtype","r")

setmodvar "modulename","membname","membtype" - помещает eax или st(0), если вещественное, как значение переменной membname в модуле modulename, или копирует ASCIIZ строку по адресу переменной, если строка.
Модуль должен быть загружен, в нем должна быть объявлена внешняя доступная для записи переменная membname (member "membname","membtype","w")

callmodfunc "modulename","membname","membtype" - вызывает функцию membname в модуле modulename.
Если передаются стековые параметры нужно позаботиться об их удалении.
Регистр eax используется в процессе вызова.
Модуль должен быть загружен, в нем должна быть объявлена внешняя доступная для вызова функция membname (member "membname","f","x")



ПРЕДОПРЕДЕЛЕННЫЕ МОДУЛИ
~~~~~~~~~~~~~~~~~~~~~~~

- mem
---------------------------------------------------------------
модуль mem содержит стандартные функции для работы с памятью


Члены модуля mem:
get - получить память
параметры:
количество байт ("ud")
возврат:
адрес ("ud")
reget - изменить размер памяти
параметры:
старый адрес ("ud")
количество байт ("ud")
возврат:
новый адрес ("ud")
free - освободить память
параметры:
адрес ("ud")
size - получить размер выделеной памяти
параметры:
адрес ("ud")
возврат:
размер ("ud")
cpy - копирование памяти (нормально работает с перекрывающимися областями)
параметры:
адрес получателя ("ud")
адрес источника ("ud")
размер ("ud")
возврат:
адрес получателя ("ud")

- str
---------------------------------------------------------------
модуль str содержит стандартные функции для работы со строками


Члены модуля str:
len - длина строки
параметры:
адрес строки("s")
возврат:
количество байт ("ud")
cmp - сравнить строки
параметры:
адрес строки 1 ("s")
адрес строки 2 ("s")
возврат:
результаты сравнения ("ud").
=0 (s1==s2),
<0 (s1 >0 (s1>s2)
cat - дописать к первой строке вторую (должно хватать памяти)
параметры:
адрес строки 1 ("s")
адрес строки 2 ("s")
возврат:
адрес строки 1 ("s")
format - отформатировать в строку (используется wsprintf - параметры необходимо удалять вручную)
параметры:
адрес строки приемника ("s")
адрес строки шаблона ("s")
возврат:
длина отформатированой строки("ud")
match - поиск в строке с использованием regular expression
параметры:
адрес строки ("s")
адрес regular expression шаблона ("s")
начальный символ ("ud")
флаги ("ud"), пока 0
возврат:
адрес массива результатов ("ud"), где в массиве по смещению:
0 - количество результатов,
4 - начальный символ найденой по шаблону подстроки
8 - символ подстроки следующий за последним найденым по шаблону
12 - начальный символ найденой по подшаблону 1 подстроки
16 - символ подстроки следующий за последним найденым по подшаблону 1
20 - начальный символ найденой по подшаблону 2 подстроки
24 - символ подстроки следующий за последним найденым по подшаблону 2
...
n*8+4 - начальный символ найденой по подшаблону n подстроки
n*8+8 - символ подстроки следующий за последним найденым по подшаблону n
Внимание: память под массив выделяется автоматически, но удалять ее необходимо вручную с помощью функции free модуля mem

- lua
---------------------------------------------------------------
модуль для взаимодействия с основной программой
Процедура обработки схожа со стандартными модулями.





Hosted by uCoz