![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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