Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.06.05;
Скачать: [xml.tar.bz2];

Вниз

Как вызвать SetLength из процедуры на ассемблере   Найти похожие ветки 

 
Вячеслав Белкин   (2003-05-21 14:20) [0]

Уважаемые мастера, подскажите как вызвать процедуру SetLength на ассемблере.

Имеется некий динамический массив
Type TBase = Integer;
Type TArBase = array of TBase;

Далее имеется некая процедура на ассемблере, где должна выделится область памяти
для массива.
Я посмотрел в отладчике, как в Делфи стандартно вызывается SetLength.
Но не пойму, что писать в строке mov edx,[00456787ac] вместо константы-адреса

asm
...

push 15 // Размер массива (Знаю как задать)
mov eax, [ebx] // Указатель на массив (Знаю как задать)
mov ecx, 1 // Размерность массива (Знаю как задать)
mov edx, [00456787ac]<-- //Здесь я должен указать указатель на тип TArBase
//(Не знаю как задать). Конструкция TypeInfo(TArBase) не подходит,
// При ее использовании получается mov edx, $30
//(По адресу [00456787ac] нет такого числа)
call system.@DynArraySetLength
add esp,4 //непонятная для меня строка (Не знаю что такое)
...
end;

Подскажите как решить проблему или куда еще обратиться за помощью


 
VMcL   (2003-05-21 14:40) [1]

В Helpe написано, что нужно свою "болванскую" функцию в таких случаях писать. Например:


procedure MySetLen(var DynArr: TArBase; Len: Integer); register;
begin
SetLength(DynArr, Len);
end;


 
Digitman   (2003-05-21 15:38) [2]

или - только вот так :

procedure TForm1.Button4Click(Sender: TObject);
type
TMyArray = array of Integer;
var
dynarrtypeinfo: Pointer;
x: TMyArray;
begin

dynarrtypeinfo := typeinfo(TMyArray); // а иначе - никак ! только компилятор "знает" будущий адрес блока инф-ции о типах

asm
push 10 // стек вырос на 4 байта, на его вершине - параметр нового размера массива
lea eax, x // адрес дин.массива
mov ecx, 1 // изменяемая размерность
mov edx, dynarrtypeinfo // инф-ция о типе
call system.@DynArraySetLength // собственно - вызов
add esp, 4 // сбалансируем стек
end;
showmessage(inttostr(high(x)));
end;

все же см. VMcL (21.05.03 14:40)
делать вот так, на "чистом" асме - это извращение и мазохизм "в одном флаконе" !)


 
Вячеслав Белкин   (2003-05-23 14:49) [3]

Спасибо всем, все заработало!

А этим "мазохизмом" я занимаюсь, потому-что есть потребность в выполнении битовых операций над последовательностями слов (критично по времени). Эти операции лучше выполнять на ассемблере.

С уважением, Вячеслав Белкин



 
Smithson   (2003-05-23 15:21) [4]

Не надо мазохизма!

asm
xor ax, bx
and bx, cx
or ax,cx
end;


 
Digitman   (2003-05-23 15:39) [5]


> Вячеслав Белкин


ну ты установи размер массива обычным образом, а уж битовые операции над его элементами вынеси в асм-блок)

непонятно, что ты выигрываешь в случае размещения setlength() в asm-блоке



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

Форум: "Основная";
Текущий архив: 2003.06.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.009 c
14-13463
sniknik
2003-05-19 19:01
2003.06.05
А вот кому повеселится!? ;о)


3-13050
Ragazor
2003-05-16 17:30
2003.06.05
(SQL) Select ....WHERE......LIKE при работе с полем MEMO


14-13402
SPeller
2003-05-16 16:26
2003.06.05
Нужен MPEG-4 или DivX encoder


14-13466
LeReve
2003-05-17 21:21
2003.06.05
Наверное один из глупых вопросов...но с помощью каких функций...


1-13166
Сюткин Павел
2003-05-24 09:49
2003.06.05
Версия MS Office





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский