2012-05-11 2 views
5

Я смотрел этот код, и я смущен насчет rep cmpsb.Смущенный инструкцией CMPSB

.LOOP: 
     push cx 
     mov  cx, 0x000B       ; eleven character name 
     mov  si, ImageName       ; image name to find 
     push di 
rep cmpsb           ; test for entry match 
     pop  di 
     je  LOAD_FAT 
     pop  cx 
     add  di, 0x0020       ; queue next directory entry 
     loop .LOOP 
     jmp  FAILURE 

Я понимаю, что он повторяет cmpsb cx раз, но как это сравнивает две строки? Скажем, например, было сравнение «Hey \ 0» и «hey \ 0», и этот цикл сравнивал 4 строки символов. Первые символы различны, и регистр EFlags будет установлен соответствующим образом. Однако команда cmpsb повторяется, а следующие символы будут одинаковыми. Возможно, я не понимаю, как работает cmpsb, но похоже, что этот цикл неправильно сравнивает две строки. Действительно ли этот цикл работает?

+1

Ум, почему вы не видите, как CMPSB работает в руководстве по процессору? –

+0

Um @Alex Я сделал. Путаница была вызвана инструкцией ** REP **. –

+0

REP не является самостоятельной инструкцией. Это префикс инструкции, модификатор команды IOW. Документация объясняет это также. –

ответ

10

Причина REP заключается в том, что rep имеет ту же кодировку, что и REPE (F3h). В принципе, REPE - это то, что нужно использовать здесь, но в зависимости от вашего ассемблера он может просто использовать REP как правильно.

Итак, на самом деле у вас есть cmpsb REPE, это просто, что ваш (а) ассемблер действительно не знает.

1

Я думаю, вам нужно использовать префикс REPE или REPNE с помощью cmpsb (это было некоторое время).

+0

Правильно, вы либо используете 'repeat' (repeat while equal), либо' repne' (повторите, пока не равны). –

1

Вы правы, этот код не будет работать. Вам нужно использовать repe cmpsb (повторите при равном сравнении строки bytewise).

0

С моей точки зрения, поскольку я просматриваю один и тот же учебник по brokenthorn, он будет сравнивать первый байт Imagename с первым байтом жирной записи, если они будут одинаковыми.

Он будет продолжаться до 11 символов (имя файла и расширение) при первой разнице. Он установит флаг ZF, если они будут одинаковыми, а флаг ZF будет очищен.

Итак, после сравнения всего имени файла, он затем перепрыгнет, чтобы загрузить эту жирную запись, если они одинаковы. Если нет, он загрузит следующую запись и сравнит это имя файла.

Смежные вопросы