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

Вниз

Как вызвать 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.019 c
3-13058
noteens
2003-05-15 19:40
2003.06.05
TDBGrid


1-13178
super_alex
2003-05-26 13:09
2003.06.05
Мигает bitmap!!! Что делать?


1-13305
Seldon
2003-05-24 22:36
2003.06.05
Unicode -> String


1-13238
kruzoman
2003-05-27 14:25
2003.06.05
как получить параметры


1-13117
Beregin
2003-05-24 19:23
2003.06.05
TFileStream?