Форум: "Начинающим";
Текущий архив: 2007.05.13;
Скачать: [xml.tar.bz2];
ВнизDelphi + ассемблер Найти похожие ветки
← →
sat © (2007-04-24 20:09) [0]понимаю, что отлаживать программы на асемблере крайне тяжело, но все же может быть кто нибудь поможет
мне надо перевести процеду написанную на 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
вот аналог на асме
где то допустил ошибку и совсем не могу найти... из - за нее работает нестабильно и иногда вылетает прога...((
← →
Anatoly Podgoretsky © (2007-04-24 21:08) [1]Отлаживать программу на ассемблере много проще, чем на ЯВУ
← →
Rial © (2007-04-24 23:54) [2]По идее, в простом случае все просто. :))
Сделай точку останова где- нибудь в процедуре.
Когда дойдет выполнение туда, посмотри в окне CPU
код. Он там по воле судьбы на асме.
Тут останется только метки пожалуй подправить.
Вообще, ты же не микроконтроллеры, наверное,
программируешь... зачем оно тебе ?
← →
sat © (2007-04-25 00:16) [3]просто задача)) да можно взять и из CPU
← →
sat © (2007-04-25 00:32) [4]хотя из CPU сложнее)) гораздо сложнее
← →
Rial © (2007-04-25 01:03) [5]> [4] sat © (25.04.07 00:32)
> хотя из CPU сложнее)) гораздо сложнее
Чем конкретно хуже, не понятно мне ?
← →
Германн © (2007-04-25 01:26) [6]
> Чем конкретно хуже, не понятно мне ?
>
А он не говорил, что хуже. Он говорил сложнее. Хотя объяснить смысл его двойных скобок
> ))
я не в состоянии. :)
← →
DevilDevil © (2007-04-25 02:16) [7]я, честно говоря, не понимаю, что происходит.
зачем тут этот код: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. предполагаю, ты плохо знаешь ассемблер.
← →
marathoner (2007-04-25 02:51) [8]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 дальше нужно разбираться содержательно. Трудно судить о программе, не зная алгоритма.
← →
sat © (2007-04-25 15:29) [9]DevilDevil ©
marathoner
да регистры умножаются для индексации массива integer - 4 байта
a[R*4-4] - не люблю сложно читаемые команды(если их так можно назвать)
просто мне надо реализовать на ассемблере сортировку при помощи бинарной кучи как вставку в Delphi
может кто знает где можно найти готовые алгоритмы на асме?
← →
Сергей М. © (2007-04-25 15:34) [10]
> sat © (25.04.07 15:29) [9]
"На ассемблере" в дан.случае - это идея-фикс или чем-то действительно обоснованная необходимость ?
← →
Alexey (AZ) (2007-04-25 16:05) [11]Дизассемблируйте и поправьте метки.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.05.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.043 c