Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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 компилятор тоже отказался принимать, но тем, что генерит он сам, вызывает из 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.014 c
1-1122020655
Profik
2005-07-22 12:24
2005.08.14
Текст с картинками


3-1120745203
VictorT
2005-07-07 18:06
2005.08.14
Имеет ли значение в современных СУБД (в частности MySQL) порядок


4-1119361483
Grief
2005-06-21 17:44
2005.08.14
вызов из dll процедуры, выдающей массив


14-1122140424
X9
2005-07-23 21:40
2005.08.14
2 компа + 2 сет.платы + витая пара = troubles


4-1118907013
Unknown user
2005-06-16 11:30
2005.08.14
функция SetDIBitsToDevice





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский