Форум: "Основная";
Текущий архив: 2005.08.14;
Скачать: [xml.tar.bz2];
ВнизКак правильно на ассемблере записать 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 компилятор тоже отказался принимать, но тем, что генерит он сам, вызывает из 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. Так что...
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.014 c