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

Вниз

встроенный ассемблер   Найти похожие ветки 

 
Sergey Pavl   (2002-09-23 18:39) [0]

У меня возникла проблема со встроенным ассемблером. В делфи я формирую динамический массив. Далее мне нужно провести обработку элементов этого массива в среде встроенного ассемблера, после чего опять работать с этими данными в делфи. Пробовал делать по правилам турбо паскаля для статического массива, но компилятор ругается. Просьба, подсказать, как читать и писать в динамические массивы во встроенном ассемблере. Также, если кто знает, дайте ссылку на описание встроенного ассемблера в делфи, желательно на русском. Чем отличается встроенный ассемблер делфи от паскалевского?


 
MBo ©   (2002-09-23 18:53) [1]

небольшая книжка есть на www.podgoretsky.com

переменная динамического массива является указателем, адресом нулевого элемента

вот пример процедуры заполнения дин. массива FA (Array of Integer)
значением Сolor c некоторыми преобразованиями
Здесь FA- ПОЛЕ объекта, поэтому пришлось добавлять смещение - адрес самого объекта

procedure TQuadDib.Fill(const Color: TColor);
var Count:Cardinal;
begin
Count:=FWidth*FHeight;
asm
PUSH EDI
MOV EAX,Self
MOV EDI,[EAX+FA]
MOV EAX,Color
BSWAP EAX
SHR EAX,8
MOV ECX,Count
REP STOSD
POP EDI
end;
end;


 
Dimka Maslov ©   (2002-09-23 18:53) [2]

Вот пример функции, вычисляющей сумму элементов динамаического массива:
function ProcessDynArray(Data: array of integer): Integer;
asm
// EAX - указатель на первый элемент массива
// EDX - количество элементов массива
push esi
push ebx
mov esi, eax // теперь указатель в ESI
xor eax, eax
xor ebx, ebx
@@LOOP_START:
cmp edx, 0
jz @@LOOP_END
add eax, [esi+ebx]
add ebx, 4
jmp @@LOOP_START
@@LOOP_END:
pop ebx
pop esi
ret
// EAX -> Результат, возвращаемый функцией
end;

Вообще же правила просты:
1. Первые три параметра передаются через регистры EAX, EDX и ECX (именно в таком порядке)
2. Остальные параметры через стек как обычно (обращаться к ним надо по имени)
3. Результат функции передаётся через EAX
4. Свободно менять можно только регистры EAX, EСX и EDX, остальные надо сохранять в стеке



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

Текущий архив: 2002.10.03;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.018 c
1-7953
AFrolov
2002-09-20 17:39
2002.10.03
Как узнать выделена строка в StringGrid или нет?


3-7872
RDA
2002-09-13 15:20
2002.10.03
мастер - деталь


6-8082
Brand
2002-07-28 17:29
2002.10.03
Can t create new socket


3-7879
Engel
2002-09-12 18:40
2002.10.03
Работа DBASE IV в сети.


14-8144
FLIZ_
2002-09-04 11:49
2002.10.03
как в InstallShieldExpress сделать заголовок русским шрифтом?