Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2009, 13:05   #21
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ты знаеш какие параметры эти функции принимают?
SDK на них есть?
Я должен сделать универсально, а в runtime будут известны параметры, имена функций и имя dll файла.

и еще вопросик такой: что это за директива $METHODINFO такая? в справке нет, но делфи не ругается. недокументированная какая-то.

Последний раз редактировалось Роман Радер; 19.02.2009 в 13:20.
Роман Радер вне форума Ответить с цитированием
Старый 19.02.2009, 13:33   #22
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Роман Радер Посмотреть сообщение
и еще вопросик такой: что это за директива $METHODINFO такая? в справке нет, но делфи не ругается. недокументированная какая-то.
У меня в справке есть (Turbo Delphi):
Цитата:
The $METHODINFO switch directive is only effective when runtime type information (RTTI) has been turned on with the {$TYPEINFO ON} switch. In the {$TYPEINFO ON} state, the $METHODINFO directive controls the generation of more detailed method descriptors in the RTTI for methods in an interface. Though {$TYPEINFO ON} will cause some RTTI to be generated for published methods, the level of information is limited. The $METHODINFO directive generates much more detailed (and much larger) RTTI for methods, which describes how the parameters of the method should be passed on the stack and/or in registers.
вот это "much more detailed" - те самые структуры
TMethodInfoHeader, TReturnInfo и TParamInfo.
alexBlack вне форума Ответить с цитированием
Старый 19.02.2009, 13:55   #23
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

Цитата:
Сообщение от alexBlack Посмотреть сообщение
У меня в справке есть (Turbo Delphi):


вот это "much more detailed" - те самые структуры
TMethodInfoHeader, TReturnInfo и TParamInfo.
да-да, простите что не отписался, я уже разобрался с директивой.
Роман Радер вне форума Ответить с цитированием
Старый 20.02.2009, 00:32   #24
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

Вот подсказали:
Код:
void *FuncAddr=GetAddr(FuncName);
asm{
mov eax,0
lab:
push [Param+ecx]
inc ecx
cmp ecx,ParamSize
jne lab
call [FuncAddr]
}
что вы думаете по этому поводу?
я лично не очень понимаю что это правильно.
Роман Радер вне форума Ответить с цитированием
Старый 20.02.2009, 01:00   #25
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Это универсальное решение, аргументы можно передавать любые. Принцип прост, в массив param кладутся все аргументы задом наперед и вызывается вот эта функция.
Код:
void funcCall(char *szFName,char *Param)
{
void *FuncAddr=GetAddr(FuncName);
  asm{
  mov eax,0
  lab:
  push DWORD PTR[Param+ecx] ; маленькая оптимизация, так вроде бы чуть чуть быстрее если не ошибаюсь
  add ecx,4 
  cmp ecx,ParamSize
  jne lab
  call [FuncAddr]
  }
}
PS: Что то мне кажется что ваш вопрос не о том был?
"Тяжело в учении, легко в бою" - А.В. Суворов

Последний раз редактировалось rpy3uH; 20.02.2009 в 08:34.
Ivan_32 вне форума Ответить с цитированием
Старый 20.02.2009, 01:07   #26
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

Цитата:
PS: Что то мне кажется что ваш вопрос не о том был?
так ведь можно адресом взять адрес на функцию из загруженной ДЛЛки, поместить в массив параметры... и вызвать.
или нет?

ЗЫ тоесть не в массив. просто в память. ведь каждый параметр разный размер имеет.

Последний раз редактировалось Роман Радер; 20.02.2009 в 10:53.
Роман Радер вне форума Ответить с цитированием
Старый 20.02.2009, 12:22   #27
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

вроде-бы получилось этим способом.
люди добрые, скажите как в ассемблере передать не указатель на память, а содержимое?? а то хотя бы integer передается указателем.

пока что я работаю с моделью stdcall. если все получится, продолжу с register, pascal и cdecl по этому-же принципу.

Кстати, модель register не такая уже и непонятная. там первых 3 параметра заносятся в регистры eax,ebx,ecx, а остальные - в стек. правда, не знаю в каком порядке.

Последний раз редактировалось Роман Радер; 20.02.2009 в 13:22.
Роман Радер вне форума Ответить с цитированием
Старый 20.02.2009, 13:19   #28
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Про стек не забывайте, при cdecl его чистит сама программа, при fastcall(он же register) функция
пыщь

Последний раз редактировалось JTG; 20.02.2009 в 13:23.
JTG вне форума Ответить с цитированием
Старый 21.02.2009, 13:27   #29
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

Все! сделал, вроде работает. Осталось только выяснить как типы засовывать - по адресу или напрямую. об этом - ниже.

Сделал я так:
(stdcall!)
Код:
var
  testptr,param:pointer;
  mm:TMemoryStream;
  i,paramsize:integer;
begin
  testptr:=@test;
  mm:=TMemoryStream.Create;
// в обратном порядке кидаю параметры в память
  i:=20;
  mm.Write(i,sizeof(i));
  i:=10;
  mm.Write(i,sizeof(i));
// здесь надо кидать по 4 байта - или указатель, или значение.
  mm.Position:=0;
  paramsize:=mm.Size;
  param:=mm.Memory;
  asm
    mov eax,0
    mov ecx,0
    lab:
    mov ebx,[Param+ecx]
    // получаю значение под указателем
    // если этого не сделать, то положим указатель на память вместо значения.
    mov ebx,[ebx]
    // в стек
    push ebx
    add ecx,4
    cmp ecx,ParamSize
    jne lab
    // сам вызов
    call [testptr]
  end;
end;
Извините, что в этой-же теме, но такие вопросы попутно возникли:
1) Какие типы нужно передавать по адресу, а какие - напрямую. (integer - я знаю точно, что напрямую и классы - по адресу. а остальные?).
2) Каким образом нужно "чистить стек"?
Роман Радер вне форума Ответить с цитированием
Старый 21.02.2009, 16:24   #30
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

Чистить стек можно с помощью любого регистра pop-ами, а можно сделать проще - просто сохранить esp где ни будь и восстановить. Вобще то любую переменную больше 4 байт обычно передают по адресу, так как она уже является массивом и считывать ее придется уже побайтово, тоесть инкрементируя адрес. Но я правда не уверен насчет языков высокого уровня, что там из себя представляют переменные. Я бы делал для надежности так :
int a;
LEA eax,a
mov ebx,[eax]
ну это конечно утрировано, но зато надежно.

mov ebx,[Param+ecx]
mov ebx,[ebx]

Вот в эту шаманскую песенку я не вкурил. [Param+ecx] это уже ваша переменная со смещением, двойное слово. Или там в param список адресов?
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание и вызов библиотеки dll DM_bite Помощь студентам 3 15.06.2010 12:47
Вызов функции MarSeON PHP 2 01.08.2008 20:22
вызов из dll не ShowModal. Roof Общие вопросы Delphi 7 25.07.2008 15:22
Автоматический вызов функции класса Flaton Общие вопросы C/C++ 4 19.10.2007 17:56
Вызов функции по таймеру Lexicss Общие вопросы Delphi 4 30.05.2007 22:47