![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно на ассемблере записать CALL New? [D5]
evvcom © (2005-07-23 13:59:00)Попытался я на ассемблере вызвать New стандартным способом вызова процедур/функций:
CALL New, но компилятор ругнулся "Invalid combination of opcode and operands". Пробовал и _New и другие { Procedures and functions that need compiler magic }, которые начинаются с "_". Все, которые попробовал не хотят компилироваться с таким(и) вызовом(-ами). Зато другие вызовы, напрмер, CALL LoadResString из того же System, но без шаманства компилятора, нормально компилируются. Чем же для компилятора является имя "New" и как эту процедуру и ей подобные можно вызвать из процедуры на ассемблере?
evvcom (2005-07-23 14:45:00) [1]
> Mx © (23.07.05 14:23) [5]
Ура! Точно, принял. Этого я и хотел. А я пробовал New, _New, @New, System.New, а вот System.@New не попробовал! Спасибо!
Mx (2005-07-23 14:23:00) [2]А если написать так: system.@New, то все компилер принимает.
evvcom (2005-07-23 14:19:00) [3]
> заменяет на GetMem
Ни фига. Во всяком случае в D5. В D7 сейчас проверять неохота, все равно этот проект в семерку переделывать не буду. На вызов New D5 делает так:
mov edx,[$...] // TypeInfo
mov eax,$... // SizeOf(Type)
call @New
mov [ebp-$0c],eax // сохранение указателя в переменной
Вызов CALL @New компилятор тоже отказался принимать, но тем, что генерит он сам, вызывает из Systemprocedure _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. Так что...
jack128 (2005-07-23 14:11:00) [4]Никак. New/Dispose/ReadLn еще туча разных процедур являются стандартными. Конкретный код, который будет сгенерирован вместо вызова этих процедур зависит от контекста вызова..
очевидный пример:
ReadLn;
и
ReadLn(s); очевидно, что в этом примере будет сгенерирован разный код, в зависимости от числа и типа параметров, переданных в readln, но асм коде компилятор не может разобраться, потому и выдается сообщение об ошибке..
begin...end © (23.07.05 14:02) [1]
Сам компилятор дельфийский вызов New заменяет на GetMem.
+ инициализация, которая так же зависит от типа переданных параметров.
Anatoly Podgoretsky (2005-07-23 14:03:00) [5]для компилятора имя "New" является compiler magic
Такой функции/процедуры просто нет.
begin...end (2005-07-23 14:02:00) [6]Сам компилятор дельфийский вызов New заменяет на GetMem.