Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ASM [D7, XP]


AndrewHz ©   (2007-01-07 18:41:00) 

Допустим есть процедура MyProc;
Подскажите пожалуста как правильно запхнуть её в цикл, на асм
что-то типа


whiletrue do
Myproc;
end;


DevilDevil   (2007-01-07 21:39:00) [1]


> я считаю что это за счёт большого использования basm в KOL


Поверьте мне наслово, порой крайне тяжело написать код на ассме, работающий быстрее, чем Delphi-йский, тем более начинающему... а вот наоборот - вполне возможно.

Вопрос: что это за процедура, которая во столько раз выполняется быстрее в KOL ?

PS:

procedure MyProc(var Min,Max:integer);
begin
  min:=min+1;
end;
...

var
 MyMin, MyMax : integer;
asm
@@1:
 mov MyMin, 0
 mov MyMax, 100
 lea eax, MyMin // так вроде
 lea edx, MyMax
 CALL  MyProc

 cmp MyMin, MyMax
 jne @@1
end;


Anatoly Podgoretsky   (2007-01-07 21:32:00) [2]

> AndrewHz  (07.01.2007 19:37:11)  [11]

У тебя ошибка в программе.


AndrewHz   (2007-01-07 19:37:00) [3]

А зачем асм? Вы совсем не цените совместимость!

Одна и таже процедура в D7 и D7(KOL)
выполняется поразному
всмысле по времени
и разница очень значительна (KOL=5sec D7=73sec)
я считаю что это за счёт большого использования basm
в KOL
Пробовал и потоки но большая морока между передачей информации


begin...end   (2007-01-07 19:37:00) [4]

> AndrewHz   (07.01.07 19:31) [10]

Не понял. Внутри процедуры изменяется глобальная переменная?

Напишите полноценный паскалевский пример -- потом разберём, как сделать аналог на ассемблере.


AndrewHz   (2007-01-07 19:31:00) [5]

Ну типа

MyProc(Min,Max:integer);
begin
min:=min+1;
end;

asm
@@1:
  CALL  MyProc(0,100);

if min=max the exit

  JMP   @@1
end


ors_archangel   (2007-01-07 19:27:00) [6]

А зачем асм? Вы совсем не цените совместимость!


begin...end   (2007-01-07 19:23:00) [7]

> AndrewHz   (07.01.07 19:14) [6]

А каково условие выхода из цикла?


begin...end   (2007-01-07 19:18:00) [8]

Команда LOOP служит для организации цикла с ограниченным числом итераций (это число перед циклом следует поместить в ECX, который при очередном проходе цикла будет декрементироваться). А "бесконечный" цикл (while true do) организуется так, как в [3], только в delphi'шном ассемблере нет invoke:

asm
 @@1:
   CALL  MyProc
   JMP   @@1
end


При наличии у процедуры параметров, понадобится их передача перед вызовом подпрограммы, в соответствии с соглашением о её вызове.


AndrewHz   (2007-01-07 19:14:00) [9]

procedure TForm1.Button1Click(Sender: TObject);
begin
asm
@@1:
call go
LOOP    @@1
end
end;

procedure TForm1.go;
begin
Beep;
end;

Короче работает вот так
А как теперь его остановить
Ну типа Exit


AndrewHz   (2007-01-07 19:09:00) [10]


asm
@@1:

LOOP    @@1
end

Работает цикл
но если вставить
MyProc после @@1
сразу выдаёт ошибку


kaZaNoVa   (2007-01-07 18:59:00) [11]

asm
@@1:
Myproc
LOOP    @@1
end


или чё-то такое:


kaZaNoVa   (2007-01-07 18:56:00) [12]

я в асме не шарю ... но  имхо что-то типа:


StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0 //тут всякий код
jmp StartLoop


AndrewHz   (2007-01-07 18:52:00) [13]

А можна полный код

asm
Myproc
@@loop
end

Вот так но только правильно


kaZaNoVa   (2007-01-07 18:41:00) [14]

loop


Наверх

Титульная страница Поиск, карта сайта Написать письмо