Написал функцию по работе со строками. Использовал свое индексирование для доступа к строкам. Решил перейти на LODSB STOSB - потребовались команды CLD и STD. Так вот использование этих команд сильно замедлило работу функции. Я то думал, что у меня быстрее будет работать, вроде LODSB STOSB сами индексы крутят, а тут такая засада было типа так: mov ecx,10 // начало цикла mov al,[ebx] dec ecx ... ... // конец цикла сделал: pushf std mov si,10 // начало цикла lodsb ... ... // конец цикла popf
cresta Imho - опечатка, надо читать mov cx,10. magnn Afaik замедление из-за lodsb/stosb, они всегда были медленнее, но занимают меньше места.
magnn > "быстрее будет работать, вроде LODSB STOSB сами индексы крутят" Распространенное заблуждение. Все одиночные строковые операции без REP работают медленнее простых mov. А циклические операции с REP имеют достаточно большое время инициализации (оверхед), поэтому их имеет смысл использовать только при большом числе повторений иначе проигрыш м.б.еще больше. Ну и самое интересное, что REP операции работают вперед (CLD) значительно быстрее, чем назад (STD). Что касается самих CLD\STD, то они тоже не относятся к разряду быстрых, т.к. частично изменяют eflags и имеют ложную зависимость по флагам от пред.операций. В атлонах их латентность 1-2 тика, в P6 до 4-х, а вот в P4 если верить А.Фогу (т.к. сами интелы об этом умалчивают) латентность CLD\STD составляет несколько десятков тиков (?!) Поэтому сами по себе они могут заметно тормозить только на P4. Ну а в твоем случае, переход на lodsb да еще с STD никакого смысла в плане быстродействия не имеет - только доп.тормоза