Флаги не меняются.
Команда:
REPNE КОС (команда обработки строк)
Логика
while CX <> 0 ; для КОС MOVS, LODS или STOS выполнить КОС CX = CX - 1 _______________________________________________ while CX <> 0 ; для КОС CMPS или SCAS CX = CX - 1 if ZF <> 0 то заканчиваем цикл ; это единственное ; отличие от REP
REPNE - это префикс, который может быть употреблен перед любой КОС (CMPS, LODS, MOVS, SCAS и STOS). Префикс REPNE заставляет выполняться следующую за ним КОС в повторном режиме до тех пор, пока CX не станет равным 0; CX уменьшается на 1 после каждого выполнения КОС. (Для КОС CMPS и SCAS циклический повтор прерывается также, если флаг нулевого результата ZF оказывается установленным после очередного выполнения КОС. Ср. с префиксом REP, при котором циклический повтор прерывается, если ZF оказывается, наоборот, сброшенным.)
Операнды | Такт байты (слова) | Обращения | Байты | Пример |
нет операндов | 2 | - | 1 | REPNE SCASB |
Примечания:
Если CX с самого начала равно 0, то КОС не выполняется ни разу. Проверка о равенстве CX нулю проводится перед выполнением КОС. Проверка о равенстве ZF единице проводится только для команд CMPS и SCAS, причем лишь после очередного выполнения КОС.
Префиксы REPNE и REPNZ являются синонимами одного и того же префикса.
У Вас нет необходимости инициализировать ZF перед использованием повторяющихся КОС.
Повторяющаяся КОС, которая была прервана между повторами, будет корректно возобновлена после возврата из прерывания. Однако, если перед КОС находятся также другие префиксы (например, LOCK) в добавление к REPNE, то все префиксы, кроме того, который непосредственно предшествует команде, будут потеряны. Поэтому, если Вам нужно использовать команду с несколькими префиксами одновременно, то Вам следует запретить прерывания на время выполнения команды (и снова разрешить из после ее выполнения). Обратите Ваше внимание на то, что даже такая мера предосторожности не предохраняет от немаскированных прерываний и что обработка длинных строк может существенно задерживать обработку прерываний.
Следующий пример иллюстрирует поиск первого байта, равного 'A' в стобайтовой строке STRING :
CLD ;будем двигаться в прямом направлении MOV AL,'A' ;будем сравнивать с 'A' LEA DI, STRING ;засылаем в DI стартовый адрес строки MOV CX,100 ;сравнивать будем 100 байтов REPNE SCASB ;сравниваем 'A' с очередным байтом DEC DI ;возвращаем указатель DI на 'A'
После окончания выполнения команды REPNE SCASB, CX будет равен нулю, если байтовое значение 'A' не было обнаружено в строке STRING, и CX будет больше 0, в противном случае.