![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
встроенный ассемблер [D5, WinXP]
Sergey Pavl © (2002-09-23 18:39:00)У меня возникла проблема со встроенным ассемблером. В делфи я формирую динамический массив. Далее мне нужно провести обработку элементов этого массива в среде встроенного ассемблера, после чего опять работать с этими данными в делфи. Пробовал делать по правилам турбо паскаля для статического массива, но компилятор ругается. Просьба, подсказать, как читать и писать в динамические массивы во встроенном ассемблере. Также, если кто знает, дайте ссылку на описание встроенного ассемблера в делфи, желательно на русском. Чем отличается встроенный ассемблер делфи от паскалевского?
MBo (2002-09-23 18:53:00) [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:00) [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, остальные надо сохранять в стеке