Главная страница
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.012 c
3-7852
Guardian
2002-09-11 13:50
2002.10.03
Не передаются параметры в функцию dbiAddIndex


1-7915
Fog
2002-09-19 15:32
2002.10.03
Чужие переменные...


1-8055
Vdovin-AV@yandex.ru
2002-09-20 13:51
2002.10.03
Дабл Клик в Memo


1-7991
Metotrone
2002-09-21 00:35
2002.10.03
Закрытие программы


3-7839
Alex-kosmonavt
2002-09-12 16:47
2002.10.03
TQuery