Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.08.25;
Скачать: [xml.tar.bz2];

Вниз

Быстрый цикл на асме   Найти похожие ветки 

 
Chlavik   (2003-08-08 19:16) [0]

Как на асме сделать цикл что бы щётчик не спадал а возростал от 0 до 255 (0 и 255 включая)
у меня так я ситуация

xor ecx,ecx
// первый цикл

mov cx,$FF

@s1:
mov [eax+ecx],cl // тело цикла
dec cx
jns @s1

// после первого в cx $FFFF поэтому во втором я первым inc а потом тело...

@s2:
inc cx
//тут тело второго цикла
cmp cl,$FF
jne @s2



cl иторого цикла должен возростать, но это замедляет цикл так как использую cmp можно второй цикл сделать быстрее ?


 
AlexRush   (2003-08-08 19:34) [1]

в первом цыкле вместо

dec cx
jns @s1

юзай
loop @s1

тогда и cx после первого цикла нулю будет равен;

P.S. а почему не привел тело второго цикла ?


 
Chlavik   (2003-08-08 20:16) [2]



> юзай
> loop @s1


Ноль в теле цикла тоже нужен!


А это важно ?

вот весь код процедуры...

asm
push ecx
push eax
add eax,$4

mov byte ptr [eax+$100],$0
mov byte ptr [eax+$101],$0

xor ecx,ecx
mov cx,$FF

@s1:
mov [eax+ecx],cl
dec cx
jns @s1

// xor ecx,ecx
push ebx
push edx

xor ebx,ebx
xor edx,edx

@s2:
inc cx
mov bl,cl
and bl,$F
add edx,[eax+$102+ebx]
add edx,[eax+ecx]
and edx,$FF
mov bl,[eax+ecx]
push ebx
mov bl,[eax+edx]
mov [eax+ecx],bl
pop ebx
mov [eax+edx],bl
//bt cx,9
cmp cl,$FF
Jne @s2

pop edx
pop ebx
pop eax
pop ecx
end;


Можно ли ускорить второй цикл, в принципе можна изменить процедуру как угодно но в сторону скорости...


 
Palladin   (2003-08-08 21:25) [3]

в любом случае, имхо, оптимизация проводится совсем не там...


 
Chlavik   (2003-08-08 21:29) [4]

Ну ану если можна в другом месте (в теле цикла) то помогите...


 
Дмитрий Белькевич   (2003-08-09 03:26) [5]

Задачу обьясни - один цикл? Два? Что где должно крутится? Циклы не вложенные, как я вижу? И вообще, зачем тебе это, и зачем убыстрять второй цикл - всё равно разницы в пару тактов не заметишь.


 
DHDD   (2003-08-09 04:50) [6]

1. push и pop медленно работают, замени.
2. cmp тоже не быстро работает, можно заменить.


 
Verg   (2003-08-09 11:36) [7]

Подождите, loop на современных "пнях" работает чуть ли не медленнее, чем dec-cmp-jnz.


 
Chlavik   (2003-08-09 14:57) [8]


> Циклы не вложенные, как я вижу? И вообще, зачем тебе это,
> и зачем убыстрять второй цикл - всё равно разницы в пару
> тактов не заметишь

Скорость очень важна даже пару тактов
Циклы не вложены.

первый инициализирует масив [0..255] of byte кадому елементу значение индекса а вот второй просто делает операцию перемешивания значений елементов в этом масиве

я чють чють больше разобрался в асме и переписал его так:
asm
push ebx
push edi
mov edi,eax
add edi,$4
// xor eax,eax

mov byte ptr [edi+$100],$0
mov byte ptr [edi+$101],$0

xor ecx,ecx
mov cx,$100

@s1:
dec cx
mov [edi+ecx],cl
jnz @s1


xor ebx,ebx
xor edx,edx

@s2:
mov bl,cl
and bl,$F
add edx,[edi+$102+ebx]
add edx,[edi+ecx]
and edx,$FF
mov bl,[edi+ecx]
mov al,[edi+edx]
mov [edi+ecx],al
mov [edi+edx],bl
inc cx
cmp cx,$100
Jne @s2

pop edi
( указателя)

> Циклы не вложенные, как я вижу? И вообще, зачем тебе это,
> и зачем убыстрять второй цикл - всё равно разницы в пару
> тактов не заметишь

Скорость очень важна даже пару тактов
Циклы не вложены.

первый инициализирует масив [0..255] of byte кадому елементу значение индекса а вот второй просто делает операцию перемешивания значений елементов в этом масиве

я чють чють больше разобрался в асме и переписал его так:
asm
push ebx
push edi
mov edi,eax
add edi,$4
// xor eax,eax

mov byte ptr [edi+$100],$0
mov byte ptr [edi+$101],$0

xor ecx,ecx
mov cx,$100

@s1:
dec cx
mov [edi+ecx],cl
jnz @s1


xor ebx,ebx
xor edx,edx

@s2:
mov bl,cl
and bl,$F
add edx,[edi+$102+ebx]
add edx,[edi+ecx]
and edx,$FF
mov bl,[edi+ecx]
mov al,[edi+edx]
mov [edi+ecx],al
mov [edi+edx],bl
inc cx
cmp cx,$100
Jne @s2

pop edi
pop ebx
end;

освободив eax от параметра (указателя) что бы заюзать его в вычисления, в резудтате убрал из тела второго цикла push ebx pop ebx...


> 2. cmp тоже не быстро работает, можно заменить.

Чем можно заменить это условие перехода? Скорость очень важна (я бы аsм не юзал...)


 
SergP   (2003-08-09 23:20) [9]


> @s2:
> inc cx
> //тут тело второго цикла
> cmp cl,$FF
> jne @s2


Ну а если:

inc cx
@s2:
//тут тело второго цикла
inc cl
jnz @s2
dec cl // это если в сx должно после цикла быть то же что и в твоем варианте.


 
Marser   (2003-08-09 23:50) [10]

Я не понимаю, чьто вы выдумываете. Loop работает как три комманды? Что ж удивительного если это и есть dec, test и jnz в одном лице?


 
Anatoly Podgoretsky   (2003-08-09 23:56) [11]

Как две dec и jnz, но медленнее, как и большинство других аггрегатных команд.


 
Chlavik   (2003-08-10 00:04) [12]


> SergP ©

Thanks... ;)


 
Marser   (2003-08-10 00:22) [13]



> Anatoly Podgoretsky © (09.08.03 23:56)
> Как две dec и jnz, но медленнее, как и большинство других
> аггрегатных команд.

А проверка CX/ECX на ноль для установки флагов у вас, значит, в DEC происходит?


 
SergP   (2003-08-10 00:24) [14]


> Marser © (09.08.03 23:50)
> Я не понимаю, чьто вы выдумываете. Loop работает как три
> комманды? Что ж удивительного если это и есть dec, test
> и jnz в одном лице?


Я вообще-то на асме не пишу и не в курсе всего, но имхо если есть одна команда выполняющая дейсвия нескольких, то она должна иметь какие-то преимущества перед этими несколькими вместе взятыми (или по количеству тактов или по количеству занимаемых байт), иначе ее при разработке процессора просто не реализовывали бы.


 
Anatoly Podgoretsky   (2003-08-10 00:28) [15]

Marser © (10.08.03 00:22)
Да, так работает команда DEC и другие

SergP © (10.08.03 00:24)
Имела на старых 486 процессорах, процессор разрабатывался очень давно и был 16 битным, без конвейеров.


 
Marser   (2003-08-10 00:30) [16]


> SergP © (10.08.03 00:24)

Я асмом вообще особо не увлекаюсь, просто изучаю для общего развития. Мне тоже кажется, что loop должен быть быстрее нескольких команд, ведь это фактически подпрограмма на уровне CPU.


 
Anatoly Podgoretsky   (2003-08-10 00:34) [17]

Marser © (10.08.03 00:30)
Смотри выше, подробности в документации Интеда, там есть таблицы Latency/throughput
Конечно это кажется парадоксальным, но не менее парадоксально выполнение операции за 0.5 такта


 
Anatoly Podgoretsky   (2003-08-10 00:35) [18]

Еще дополнительно на моем сайте в проекте DDP есть две книги по ассемблеру, там это рассмотрено.


 
Marser   (2003-08-10 00:37) [19]


> Anatoly Podgoretsky © (10.08.03 00:28)
> Marser © (10.08.03 00:22)
> Да, так работает команда DEC и другие

Упс, пардон, зарвался... Dec ведь на флаг нуля влияет...Прошу прощения, Анатолий...
P.S. Как это - за пол-такта? 8-0


 
Anatoly Podgoretsky   (2003-08-10 00:44) [20]

Вот я же говорил парадокс :-)
Как точно не знаю, надо внимательно читать архитектуру, но там есть несколько конвейеров и два отдельных процессора.
А теперь еще и новая технология в Пентиуме 4 появилась - Hyper Threading - эмуляция двух процессоров, за счет двойного набора конвейеров, ускоряет на 30% тут можно уже вести речь о 4 командах за так.


 
Chlavik   (2003-08-10 00:55) [21]

А я думад что Hyper Threading это так расрекламированная функция, что Intel приувеличиивает...


 
Marser   (2003-08-10 00:59) [22]


> Anatoly Podgoretsky © (10.08.03 00:44)

Значит не парадокс, а Hi-end-изращения :-)


 
Anatoly Podgoretsky   (2003-08-10 01:03) [23]

Да нет, работающая технология, вот интересно насколько велик проигрыш по сранению с двумя процессорами, пока такой информации не имеею, но ранее читал, что два процессора дают ускорение примерно 30% :-), но все таки наверно два процессора быстрее. Теперь есть даже Ксеоны с HT технологией, там также можно будет получить допольнительный прирост производительности, если поставить более одного процессора + HT

ЗЫ: скачай книги по BASM они небольшие, но дадут некоторое прояснение.


 
Chlavik   (2003-08-10 01:05) [24]

Я уже скачал.... Но нашол только одну...


 
Anatoly Podgoretsky   (2003-08-10 01:07) [25]

Денис Христенсен и Гуйдо Гайбелс, внимательно посмотри


 
Marser   (2003-08-10 01:46) [26]


> ЗЫ: скачай книги по BASM они небольшие, но дадут некоторое
> прояснение.

Давно скачал, но пока не углублялся. Ваш перевод, кстати :-)


 
Chlavik   (2003-08-10 02:48) [27]

Я скачал Денис Христенсен...


 
Chlavik   (2003-08-10 02:50) [28]

Нашол и вторую...



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.08.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.009 c
1-81837
Maxja
2003-08-13 10:50
2003.08.25
Создание Форм, компонентов, и обрабатываемых процедур в RealTime.


1-81775
Vlad
2003-08-14 11:49
2003.08.25
Обработка исключительных ситуаций в Delphi


1-81731
Spawn
2003-08-10 17:58
2003.08.25
---|Ветка была без названия|---


4-82015
Inch
2003-06-20 23:04
2003.08.25
TMemoryStream WinApi


14-81951
Затейник - некрофил (НАСТОЯЩИЙ)
2003-08-06 19:32
2003.08.25
Стоит ли регистрироваться?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский