порядок следования префиксов repe/repne в опкоде

Тема в разделе "WASM.ASSEMBLER", создана пользователем rain, 4 дек 2007.

  1. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    При встрече опкода в котором имеются префиксы противоречащие друг другу возникает путаница. При префиксах переопределяющих сегмент играет роль только последний. А вот с repe/repne путаница. Лично у меня на текущей машине(amd duron) играет роль только первый, второй (и все последущие) в этом случае не учитываются.

    пример:
    Код (Text):
    1. _str db "aaaaabbbbbccccc"
    2. ...
    3. mov ecx, -1
    4.     mov al, 'a'
    5.  
    6.     lea edi, _str
    7.    
    8.     db 0f3h ;repe
    9.     db 0f2h ;repne
    10.     db 0f2h ;repne
    11.     db 0f2h ;repne
    12.     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 и результаты зависят от конкретного процессора а не модели процессоров?
     
  2. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Код (Text):
    1. rep_bug_01 - ecx = 0xFFFFFFFE;
    2. rep_bug_02 - ecx = 0xFFFFFFFE;
    ИМХО результаты зависят только от архитектуры процессора, модели основанные на одной архитектуре и отличающиеся степпингом вернут одинаковый результат.
     
  3. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    t00x камушек какой?
     
  4. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    rain
    Intel Pentium 4 506 2.66 GHz E0
     
  5. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Еще не плохобы делать CLD перед repne scasb, если на момент сравнения неизвестно значение D флага.

    По поводу использование префиксов - всегда учитывается только последний префикс.
     
  6. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    угу, спасибо
    а вот здесь ты в конре не прав :-\ (я про repne/repe префиксы, сегментные именно так как ты говоришь, а эти нет) как я уже говорил выше у меня учитывается именно первый
     
  7. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    rain
    0xE2 и 0xE3 уже не используются в качестве Branch Hint Prefixes?
    у мну замедляют выполнение программы.
     
  8. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    t00x хз
     
  9. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Код (Text):
    1. rep_bug_01 - ecx = 0xFFFFFFFE;
    2. rep_bug_02 - ecx = 0xFFFFFFFE;
    Core 2 DUO
     
  10. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Core Duo:
    rep_bug_01 - ecx = 0xFFFFFFFE;
    rep_bug_02 - ecx = 0xFFFFFFFE;
     
  11. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    ещё одну тему создавать лениво буду постить в этой наверно.
    Касательно bswap, по идее она работает только с 32х или 64х битными регистрами, что ж будет если к ней прилепить префикс 66 ?
    Некоторые дизасмеры дизасмят так:
    Код (Text):
    1. .text:00401006                 db      66h
    2. .text:00401006                 bswap   eax
    некоторые так:
    Код (Text):
    1. 660fc8          bswap   eax
    другие вообще так:
    Код (Text):
    1. 00401006   66:0FC8          BSWAP AX
    А вот что с результатом? у мну просто обнуляется ax, а у вас?
    короче просьба проверить следующий код и отписаться (какой камушек тоже пишите пожалуйста):
    Код (Text):
    1.     mov eax, 01234567h 
    2.    
    3.     db 66h
    4.     bswap eax
    спасибо ;)
     
  12. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    мессадж бокс выводящий результат
    не атачится гад
    http://rapidshare.com/files/77021295/test.exe.html

    И ещё вопрос как вы считаете правельнее всего будет дизассемблированная мнемоника выглядеть? (mov ax, 0 не предлагать :P)
     
  13. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    вопрос #11 - тоже, проверял под 32-bit ОС.
    66h:bswap eax