Что происходит, когда rep-префикс присоединяется к нестроковой инструкции?

Я попытался выяснить разницу в скорости между обычными циклами, циклами loop и встроенными циклами rep. Я написал три программы для сравнения поведения:

Программа 1

_start: xor %ecx,%ecx
0:      not %ecx
        dec %ecx
        jnz 0b
        mov $1,%eax
        xor %ebx,%ebx
        int $0x80       # syscall 1: exit

Программа 2

_start: xor %ecx,%ecx
        not %ecx
        loop .
        mov $1,%eax
        xor %ebx,%ebx
        int $0x80

Программа 3

_start: xor %ecx,%ecx
        not %ecx
        rep nop # Do nothing but decrement ecx
        mov $1,%eax
        xor %ebx,%ebx
        int $0x80

Оказалось, что третья программа работает не так, как ожидалось, и некоторые исследователи говорят мне, что rep nop, она же pause, делает что-то совершенно не связанное с этим.

Что делают префиксы rep, repz и repnz, если инструкция, следующая за ними, не является строковой инструкцией?


person fuz    schedule 21.04.2012    source источник
comment
Дубликат stackoverflow. ком/вопросы/7086220/   -  person Sedat Kapanoglu    schedule 21.04.2012
comment
@ssg: Нет. Вопрос, на который вы ссылаетесь, просто объясняет поведение rep nop. Что происходит с другими инструкциями? Пожалуйста, постарайтесь прочитать вопрос полностью, прежде чем проголосовать за его закрытие.   -  person fuz    schedule 21.04.2012
comment
Мне кажется, что все ваши эксперименты и исследования ушли в NOP, поэтому я подумал, что вам все равно на остальное, поскольку вы даже не потрудились их протестировать?   -  person Sedat Kapanoglu    schedule 21.04.2012
comment
@ssg Есть много людей, чья основная деятельность, похоже, заключается в выполнении NOP :-)   -  person Gunther Piez    schedule 21.04.2012
comment
@ssg Я только что заметил, что rep не работает должным образом с nop, а также с cmp $0,%ecx. Я новичок в сборке, поэтому хотел спросить, прежде чем копать дальше.   -  person fuz    schedule 21.04.2012


Ответы (2)


По-разному. rep ret иногда используется, чтобы избежать плохой производительности при прямом переходе к ret на некоторых процессорах AMD. Префиксы rep (F3) и repne (F2) также используются в качестве обязательного префикса для многих инструкций SSE (например, они изменяют варианты упакованного одиночного кода на варианты скалярного одиночного или скалярного двойного). pause (подсказка блокировки вращения) является псевдонимом rep nop. Некоторые другие новые инструкции также используют «фальшивый префикс rep» (popcnt, crc32, vmxon и т. д.). «Поддельный» или обязательный префикс стоит перед необязательным префиксом REX, поэтому нельзя сказать, что он является частью кода операции, это действительно префикс.

Другие операции генерируют #UD, если перед ними стоит rep.

person harold    schedule 21.04.2012
comment
Кроме того, в некоторых инструкциях это означает XACQUIRE/XRELEASE. - person Lewis Kelsey; 25.04.2020

Я просто процитирую руководство здесь, потому что я предполагаю, что это определяет единственное «официальное» поведение.

Из раздела 4.2 «REP/REPE/REPZ/REPNE/REPNZ — префикс операции повтора строки»:

Префикс REP можно добавить к инструкциям INS, OUTS, MOVS, LODS и STOS, а префиксы REPE, REPNE, REPZ и REPNZ можно добавить к инструкциям CMPS и SCAS. (Префиксы REPZ и REPNZ являются синонимами префиксов REPE и REPNE соответственно.) Поведение префикса REP не определено при использовании с нестроковыми инструкциями.

person mtvec    schedule 21.04.2012