Вот задумался, у меня есть три переменные, занесённые в стек. DD - все переменные двойные слова (Кстати, поясните..почему на процессоре доспуп к двойному слову быстрей чем к байту... что физически в проце происходит?) Код (Text): push a1 push a2 push a3 мне нужно сравнить их с эталонными значениями в b1, b2, b3. И при неправильности хотябы одной из них, перейти на метку exit Как это лучше сделать?.так? Код (Text): pop ebx cmp ebx, b1 jnz exit pop ebx cmp ebx, b2 jnz exit pop ebx cmp ebx, b3 jnz exit или так? Код (Text): обнулить флаг ZF ; Не помню сейчас команды pop ebx cmp ebx, b3 pop ebx cmp ebx, b2 pop ebx cmp ebx, b1 jnz exit И желательно пояснить)) почему...
stellaco второй код делает не то же самое, что первый (даже если учесть, что ты опечатался, три раза написав сравнение с b3)
Понятно) теперь вижу... логика у меня тупая была, когда это писал).. тогда такой вопрос.. как ускорить это? Код (Text): pop ebx cmp ebx, b1 jnz exit pop ebx cmp ebx, b2 jnz exit pop ebx cmp ebx, b3 jnz exit
извиняюсь за флуд, но что ты такое кодишь, что оно так критически относится к скорости??? Перехватчик баллистических ракет? или брут SHA-512?
Тут возник ещё вопрос. если оперировать с строками , где для каждого символа выделен один байт. То такие функции, как SCAS и CMPS.. Будут работать медленнее чем если бы для каждого символа выделялось бы по 4 байта??
MSoft хочу своё приложении сделать максимально качественным. кстати, шифрование и расшифровка данных, в нём тоже присутствует
stellaco надеюсь ты не забываешь главный закон оптимизации: "преждевремменая оптимизация - злейшее из всех зол" (с) Кнут
meduza Приложение обрабатывает достаточно много текста. И выделяет для одного символа, всего один байт.. Вот и волнуюсь, что может стоило работать с DD, а то если я ещё немножко напишу подобного кода, где всё будет рассчитано на байты, то изменить потом что-то будет ОЧЕНЬ сложно, (проще будет код сначала писать). Вот и пытаюсь сейчас найти ошибки , чтоб позже было меньше проблем
если моя память мне ни с кем не изменяет, тут уже обсуждалась оптимизация и говорилось, что cmp/add edi,x будет работать быстрее, чем scas (или нет?)
stellaco Слышал звон, да не знаешь где он ? На каком таком "процессоре" ? Для всей линейки P6 (PIII,PM,Core) - без разницы, а для P4 и AMД действительно, латентность mov r,m для 8\16 битных операндов на 1 такт больше, чем 32-битных. Связано это с тем, что в P4 и АМД регистры al\ax являются частью общего eax, поэтому при загрузке 8\16 бит нужно объединить их со старшими битами регистра eax. НО, во-первых, латентность mov r,m и так составляет 3 такта, поэтому отн.разница 4/3 - это не так много. Во-вторых, в потоке команд, особенно в циклах, важна не столько латентность, сколько темп (throughput) выполнения операций, а все mov r,m конвееризованы (независимо от размера операнда) и могут выполняться в P4 в каждом такте, а в АМД аж по две за такт. Поэтому на практике разница между загрузкой байта и дворда может проявиться только при ловле блох на цпочках зависимых команд, а уж никак не на сканировании символов строк Соотв-но, выделять под символы строк по дворду - это глупость, т.к. на мувах практически ничего не выиграешь, а за счет увеличения нагрузки на память и кэш еще и проиграть можно. Тем более, что для поиска символов и подстрок существуют оптимизированные алгоритмы от элементарных разворотов цикла, векторизации поиска на РОН или MMX (см.пример векторизации strlen), до наворотов типа быстрого поиска а ля Бойер-Мур