При встрече опкода в котором имеются префиксы противоречащие друг другу возникает путаница. При префиксах переопределяющих сегмент играет роль только последний. А вот с repe/repne путаница. Лично у меня на текущей машине(amd duron) играет роль только первый, второй (и все последущие) в этом случае не учитываются. пример: Код (Text): _str db "aaaaabbbbbccccc" ... mov ecx, -1 mov al, 'a' lea edi, _str db 0f3h ;repe db 0f2h ;repne db 0f2h ;repne db 0f2h ;repne repne scasb в данном случае edi останавливается на 'b' ecx при этом = 0xFFFFFFF9. У других например наоборот учитывается второй или последний прфикс. Вопрос это всё чисто случайно или есть всё-же закономерности в моделях \ фирмах производителей. по линку и в атаче 2 теста http://rapidshare.com/files/74105836/rep_bug.rar.html у мну на обоих ecx = 0xFFFFFFF9. Если будете тестить просьба преводить сведения о процессоре. Проверено ещё на одном процессоре "MD Athlon 64 X2 Dual Core 4000+" результаты теже. на Pentium M (cпасибо Mika0x65) выполянется второй префикс. Или это просто щас 1:13 и результаты зависят от конкретного процессора а не модели процессоров?
Код (Text): rep_bug_01 - ecx = 0xFFFFFFFE; rep_bug_02 - ecx = 0xFFFFFFFE; ИМХО результаты зависят только от архитектуры процессора, модели основанные на одной архитектуре и отличающиеся степпингом вернут одинаковый результат.
Еще не плохобы делать CLD перед repne scasb, если на момент сравнения неизвестно значение D флага. По поводу использование префиксов - всегда учитывается только последний префикс.
угу, спасибо а вот здесь ты в конре не прав :-\ (я про repne/repe префиксы, сегментные именно так как ты говоришь, а эти нет) как я уже говорил выше у меня учитывается именно первый
rain 0xE2 и 0xE3 уже не используются в качестве Branch Hint Prefixes? у мну замедляют выполнение программы.
ещё одну тему создавать лениво буду постить в этой наверно. Касательно bswap, по идее она работает только с 32х или 64х битными регистрами, что ж будет если к ней прилепить префикс 66 ? Некоторые дизасмеры дизасмят так: Код (Text): .text:00401006 db 66h .text:00401006 bswap eax некоторые так: Код (Text): 660fc8 bswap eax другие вообще так: Код (Text): 00401006 66:0FC8 BSWAP AX А вот что с результатом? у мну просто обнуляется ax, а у вас? короче просьба проверить следующий код и отписаться (какой камушек тоже пишите пожалуйста): Код (Text): mov eax, 01234567h db 66h bswap eax спасибо
мессадж бокс выводящий результат не атачится гад http://rapidshare.com/files/77021295/test.exe.html И ещё вопрос как вы считаете правельнее всего будет дизассемблированная мнемоника выглядеть? (mov ax, 0 не предлагать :P)