Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1177050778
vitv
2007-04-20 10:32
2007.05.13
Поиск эдита на форме.


15-1176321177
GreyWolf
2007-04-11 23:52
2007.05.13
Иконки


3-1172343764
DmitrichJ
2007-02-24 22:02
2007.05.13
InterBase-Generator-Trigger. Как узнать сгенерированный номер?


2-1176911857
vitv
2007-04-18 19:57
2007.05.13
dephi+word-создание таблиц


2-1177317931
evgenij_
2007-04-23 12:45
2007.05.13
Запустить Access Report из Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский