![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Delphi + ассемблер
sat © (2007-04-24 20:09:00)понимаю, что отлаживать программы на асемблере крайне тяжело, но все же может быть кто нибудь поможет
мне надо перевести процеду написанную на Delphi на asm и оформить в качестве вставки
Var A,B : array[1..1000] of integer;
N,i,P, j , count : integer;
описанные переменные
Procedure Heapi(ind : integer); {процедура, формирующая и исправляющяя кучу}
Var k : integer; //eax = k edi = n ecx=a[k] ebx = ind edx = k + 1
Begin
k:=ind*2;
If k<=N then
begin
if (k+1<=N) and (A[k]>A[k+1]) then
k:=k+1;
if A[ind]>A[k] then
begin
P:=A[ind];
A[ind]:=A[k];
A[k]:=P;
Heapi(k);
end;
end;
вот исходная процедура
pusha
@@beg:
mov edi , n
dec edi
shl edi , 2
mov eax , ind
dec eax
shl eax , 2
cmp eax , edi // If k<=N then
ja @@ex
mov edx , eax
add edx , 4
cmp edx , edi // if (k+1<=N)
ja @@ex
mov ecx , dword ptr a[eax]
cmp ecx , dword ptr a[edx] // (A[k]>A[k+1])
jna @@ex
mov ebx , ind
dec ebx
shl ebx , 2
cmp dword ptr a[ebx] , ecx // A[ind]>A[k]
jna @@ex
mov edx , dword ptr a[ebx]
mov dword ptr a[ebx] , ecx // P:=A[ind];
// A[ind]:=A[k];
// A[k]:=P;
// Heapi(k);
mov dword ptr a[eax] , edx
shr eax , 2
mov ind , eax
jmp @@beg
@@ex:
popa
вот аналог на асме
где то допустил ошибку и совсем не могу найти... из - за нее работает нестабильно и иногда вылетает прога...((
Alexey (AZ) (2007-04-25 16:05:00) [1]Дизассемблируйте и поправьте метки.
Сергей М. (2007-04-25 15:34:00) [2]
> sat © (25.04.07 15:29) [9]
"На ассемблере" в дан.случае - это идея-фикс или чем-то действительно обоснованная необходимость ?
sat (2007-04-25 15:29:00) [3]DevilDevil ©
marathoner
да регистры умножаются для индексации массива integer - 4 байта
a[R*4-4] - не люблю сложно читаемые команды(если их так можно назвать)
просто мне надо реализовать на ассемблере сортировку при помощи бинарной кучи как вставку в Delphi
может кто знает где можно найти готовые алгоритмы на асме?
marathoner (2007-04-25 02:51:00) [4]cmp (n-1)*4, (ind-1)*4
где тут эквивалентность? Одно вычисляется на основе n, другое на основе ind. Другое дело, что вместо этого можно просто сравнивать n и ind. Ho eax и edi используются дальше, так что тут ничего странного нет.
Можно только сказать, что
dec R
shl R,2
- везде coвершенно лишние команды. Ясно, что они предназначены для индексации массива, но это можно сделать единственной командой
a[R*4-4]
A дальше нужно разбираться содержательно. Трудно судить о программе, не зная алгоритма.
DevilDevil (2007-04-25 02:16:00) [5]я, честно говоря, не понимаю, что происходит.
зачем тут этот код:
mov edi , n
dec edi
shl edi , 2
иначе говоря, ты написалedi := (n-1)*4;
mov eax , ind
dec eax
shl eax , 2
соответствуетk := (ind-1)*4;
а потом пишешь:
cmp eax , edi // If k<=N then
хотя по логике вещей это эквивалентно
cmp (n-1)*4, (ind-1)*4
Дальше я смотреть не стал.
P.S. предполагаю, ты плохо знаешь ассемблер.
Германн (2007-04-25 01:26:00) [6]
> Чем конкретно хуже, не понятно мне ?
>
А он не говорил, что хуже. Он говорил сложнее. Хотя объяснить смысл его двойных скобок
> ))
я не в состоянии. :)
Rial (2007-04-25 01:03:00) [7]> [4] sat © (25.04.07 00:32)
> хотя из CPU сложнее)) гораздо сложнее
Чем конкретно хуже, не понятно мне ?
sat (2007-04-25 00:32:00) [8]хотя из CPU сложнее)) гораздо сложнее
sat (2007-04-25 00:16:00) [9]просто задача)) да можно взять и из CPU
Rial (2007-04-24 23:54:00) [10]По идее, в простом случае все просто. :))
Сделай точку останова где- нибудь в процедуре.
Когда дойдет выполнение туда, посмотри в окне CPU
код. Он там по воле судьбы на асме.
Тут останется только метки пожалуй подправить.
Вообще, ты же не микроконтроллеры, наверное,
программируешь... зачем оно тебе ?
Anatoly Podgoretsky (2007-04-24 21:08:00) [11]Отлаживать программу на ассемблере много проще, чем на ЯВУ