Вверх ↑
Этот топик читают: Гость
Ответов: 5446
Рейтинг: 323
#61: 2007-05-21 13:23:41 ЛС | профиль | цитата
Galkov писал(а):
this - это первый аргумент.

Galkov писал(а):
В Дельфях, соответственно, это EAX.


А вот фиг - не eax, а ecx:

#define WrapDelphiCall(t,n,t1,p1) inline t n(t1 p1) { 
__asm mov eax, p1
__asm mov ecx, this
__asm call dword ptr [ecx].p##n }

#define WrapDelphiCall2(t,n,t1,p1,t2,p2) inline t n(t1 p1, t2 p2) {
__asm mov eax, p1
__asm mov edx, p2
__asm mov ecx, this
__asm call dword ptr [ecx].p##n }

Код рабочий, проверено

[size=-2]------ Добавлено в 13:23
Соответственно, вопрос о макросе WrapDelphiCall3 остаётся в силе.
карма: 1

0
Администрация
Ответов: 15295
Рейтинг: 1519
#62: 2007-05-21 13:32:41 ЛС | профиль | цитата
this(который в Delphi называется self) передается действительно первым параметром. Плюшка эта, как и this в сях не есть вещь стандартизованная и между языками никак переданна быть не может. Точнее может конечно, но с большими проблемами в будущем. Если этот вопрос был задан в предверии разбора объекта cgt, то сразу же следует уточнить, что местный object это почти полный аналог struct в С и указателя на объект не имеет. Кроме того со стороны среды он представлен вовсе не объектом, а массивом указателей на соответствующие методы. По идее этого:
typedef struct {
  // list of cgt methods
} TCodeGenTools;
должно хватить.
карма: 27
0
Ответов: 5446
Рейтинг: 323
#63: 2007-05-21 13:33:59 ЛС | профиль | цитата
Dilma, хорошо, попробую.
карма: 1

0
Ответов: 9906
Рейтинг: 351
#64: 2007-05-21 13:40:39 ЛС | профиль | цитата
Дык он опять, посмотрел чего-то - сделал выводы
Опять посмотрел - снова сделал
Принял решение
Не получается - задал вопрос.
И думает, что мы знаем, какие выводы он делал (и правильные ли), и решения принимал
карма: 9

0
Администрация
Ответов: 15295
Рейтинг: 1519
#65: 2007-05-21 13:48:42 ЛС | профиль | цитата
iarspider писал(а):
хорошо, попробую.

это конечно же с учетом исправленной конвертации на cdecl. Сейчас такая конструкция будет работать разве что для ф-ций без параметров.

Galkov писал(а):
Дык он опять, посмотрел чего-то - сделал выводы
Опять посмотрел - снова сделал

форум развивает экстрасенсорные способности и чтение мыслей через монитор Проверено
карма: 27
0
Ответов: 5446
Рейтинг: 323
#66: 2007-05-21 14:46:20 ЛС | профиль | цитата
Dilma, предупреждать надо! А как тогда с нынешней кодогенерацией?

[size=-2]------ Добавлено в 14:46
И просьба: не отправляйте меня учить (зачёркнуто - албанский) ассемблер!
карма: 1

0
Ответов: 2125
Рейтинг: 159
#67: 2007-05-21 14:51:38 ЛС | профиль | цитата
iarspider писал(а):
А вот фиг - не eax, а ecx

Это тебе - фиг! ecx я тут использовал как временный регистр, а то, что третий параметр в Дельфях как раз в ecx передаётся, делает разработку макроса с тремя параметрами сложной и не такой элегантной, как первые два (вызов из С++ с использованием макроса абсолютно не отличался от Дельфишного, несмотря на применение промежуточной процедуры, которая, к счастью полностью подставилась inline). Self действительно передаётся первым параметром, а это eax, после чего в начале метода в стеке сохраняется ebx, а в него уже засылается eax. Таким образом Self обычно находится в регистре ebx.
карма: 1

0
Ответов: 5446
Рейтинг: 323
#68: 2007-05-21 14:59:33 ЛС | профиль | цитата
tsdima, может так? (Я в асм ноль, поэтому сильно не пинать )


#define WrapDelphiCall3(t,n,t1,p1,t2,p2,t3,p3) inline t n(t1 p1, t2 p2, t3 p3) { 
__asm mov eax, p1
__asm mov edx, p2
__asm push esp
/*__asm add eps,-4 */
__asm push this
__asm mov ecx, p3
__asm call dword ptr [esp].p##n
__asm pop /*ebx*/
/*__asm add esp,4 */
}
карма: 1

0
Ответов: 9906
Рейтинг: 351
#69: 2007-05-21 15:02:11 ЛС | профиль | цитата
tsdima писал(а):
Это тебе - фиг!

Действительно развивает экстрасенсорные способности - специально не стал писать именно эту фразу, ждал, что это же tsdima скажет
карма: 9

0
Ответов: 2125
Рейтинг: 159
#70: 2007-05-21 15:25:17 ЛС | профиль | цитата
Galkov писал(а):
ждал, что это же tsdima скажет

Ну раз ты не сказал, пришлось мне

iarspider писал(а):
может так?

Тогда уж скорее так:
#define WrapDelphiCall3(t,n,t1,p1,t2,p2,t3,p3) inline t n(t1 p1, t2 p2, t3 p3) { 
__asm mov eax, p1 
__asm mov edx, p2
__asm mov eсx, p3
__asm push ebx
__asm mov ebx, this
__asm call dword ptr [ebx].p##n
__asm pop ebx }
карма: 1

0
Администрация
Ответов: 15295
Рейтинг: 1519
#71: 2007-05-21 16:20:25 ЛС | профиль | цитата
iarspider писал(а):
А как тогда с нынешней кодогенерацией?

можно посоветовать написать временный мост для всех используемых методов cgt на Delphi вида:

procedure sdkGetElement(cgt:TRCodeGenTools; sdk:id_sdk); stdcall; export;
begin
cgt.sdkGetElement(sdk);
end;

по-моему попроще будет, чем изучение ассемблера.
карма: 27
0
Ответов: 5446
Рейтинг: 323
#72: 2007-05-21 16:23:20 ЛС | профиль | цитата
Dilma, и что, городить dll (мост) над dll (непосредственно геренатор)?
карма: 1

0
Ответов: 2125
Рейтинг: 159
#73: 2007-05-21 16:59:22 ЛС | профиль | цитата
iarspider, это он к тому, что "мост" нужен будет лишь для старых версий, а в новой версии уже будет по-новому, с декларацией stdcall

Макрос-то заработал?
карма: 1

0
Ответов: 5446
Рейтинг: 323
#74: 2007-05-21 18:13:31 ЛС | профиль | цитата
tsdima, сейчас проверю.

[size=-2]------ Добавлено в 18:13
Работает.
карма: 1

0
Ответов: 5446
Рейтинг: 323
#75: 2007-05-21 19:43:18 ЛС | профиль | цитата
Есть в TCodeGenTools такая функция


GetParam:function(index:word; value:pointer):cardinal;

Если попытаться тупо её обернуть через WrapDelphiCall, то получим большой и толстый облом. Я её отдельно завернул вот как:


inline cardinal GetParam(WORD index, void* value)
{
DWORD dwIndex = (DWORD) MAKELONG(index, 0);
__asm mov eax, dwIndex;
__asm mov edx, value;
__asm mov ecx, this;
__asm call dword ptr [ecx].pGetParam;
}

Вопрос: корректно ли такое решение?


А вот интересно, почему исходники codegen и make_xxx для PocketPC не выложены на SVN?
карма: 1

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)