Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.14;
Скачать: CL | DM;

Вниз

Как правильно на ассемблере записать CALL New?   Найти похожие ветки 

 
evvcom ©   (2005-07-23 13:59) [0]

Попытался я на ассемблере вызвать New стандартным способом вызова процедур/функций:
CALL New, но компилятор ругнулся "Invalid combination of opcode and operands". Пробовал и _New и другие { Procedures and functions that need compiler magic }, которые начинаются с "_". Все, которые попробовал не хотят компилироваться с таким(и) вызовом(-ами). Зато другие вызовы, напрмер, CALL LoadResString из того же System, но без шаманства компилятора, нормально компилируются. Чем же для компилятора является имя "New" и как эту процедуру и ей подобные можно вызвать из процедуры на ассемблере?


 
begin...end ©   (2005-07-23 14:02) [1]

Сам компилятор дельфийский вызов New заменяет на GetMem.


 
Anatoly Podgoretsky ©   (2005-07-23 14:03) [2]

для компилятора имя "New" является compiler magic
Такой функции/процедуры просто нет.


 
jack128 ©   (2005-07-23 14:11) [3]

Никак. New/Dispose/ReadLn еще туча разных процедур являются стандартными. Конкретный код, который будет сгенерирован вместо вызова этих процедур зависит от контекста вызова..
очевидный пример:
ReadLn;
и
ReadLn(s);  очевидно, что в этом примере будет сгенерирован разный код, в зависимости от числа и типа параметров, переданных в readln, но асм коде компилятор не может разобраться, потому и выдается сообщение об ошибке..

begin...end ©   (23.07.05 14:02) [1]
Сам компилятор дельфийский вызов New заменяет на GetMem.

+ инициализация, которая так же зависит от типа переданных параметров.


 
evvcom ©   (2005-07-23 14:19) [4]


> заменяет на GetMem

Ни фига. Во всяком случае в D5. В D7 сейчас проверять неохота, все равно этот проект в семерку переделывать не буду. На вызов New D5 делает так:
mov edx,[$...] // TypeInfo
mov eax,$...   // SizeOf(Type)
call @New
mov [ebp-$0c],eax // сохранение указателя в переменной

Вызов CALL @New компилятор тоже отказался принимать, но тем, что генерит он сам, вызывает из System procedure       _New{ size: Longint; typeInfo: Pointer};
asm
       { ->    EAX size of object to allocate  }
       {       EDX pointer to typeInfo         }

       PUSH    EDX
       CALL    _GetMem
       POP     EDX
       TEST    EAX,EAX
       JE      @@exit
       PUSH    EAX
       CALL    _Initialize
       POP     EAX
@@exit:
end;

Здесь конечно присутствует вызов _GetMem, который кстати тоже не компилится, но также есть и _Initialize. А потом мне потребуется еще и _Dispose. Так что...


 
Mx ©   (2005-07-23 14:23) [5]

А если написать так: system.@New, то все компилер принимает.


 
evvcom ©   (2005-07-23 14:45) [6]


> Mx ©   (23.07.05 14:23) [5]

Ура! Точно, принял. Этого я и хотел. А я пробовал New, _New, @New, System.New, а вот System.@New не попробовал! Спасибо!



Страницы: 1 вся ветка

Текущий архив: 2005.08.14;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.048 c
8-1111570778
the P
2005-03-23 12:39
2005.08.14
Помогите плз, как преобразовать PNG(8-битная прозрачность) в Ico?


3-1120734264
Kreyl
2005-07-07 15:04
2005.08.14
Еще один чайницкий: как вызнать max и min значения


1-1122059658
Spartak
2005-07-22 23:14
2005.08.14
Глюки TListView


1-1122017906
stud
2005-07-22 11:38
2005.08.14
обратиться к потоку в рантайм


14-1121582359
Kerk
2005-07-17 10:39
2005.08.14
С днем рожденья! 17 июля