Форум: "Основная";
Текущий архив: 2002.10.03;
Скачать: [xml.tar.bz2];
Внизвстроенный ассемблер Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c