отличия использования ebp / ecx

Тема в разделе "WASM.ASSEMBLER", создана пользователем cresta, 20 июн 2005.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Код (Text):
    1. 004014A0   > BD 01000000    MOV EBP,1
    2. 004014A5   . 807C3D 00 00   CMP BYTE PTR SS:[EBP+EDI],0
    3.  
    4. 004014A0   > B9 01000000    MOV ECX,1
    5. 004014A5   . 803C39 00      CMP BYTE PTR DS:[ECX+EDI],0




    Почему Olly выдаёт для ebp SS, а для ecx - DS ? ebp ничего кроме стека адресовать не должен?

    Этим объясняется разная длина CMP BYTE PTR SS:[EBP+EDI],0 и CMP BYTE PTR DS:[ECX+EDI],0 ? (Исходя из того, что данные на стеке должны быть кратными ворду)

    И как быть с тем, что байт, адресуемый инструкцией, находится не в стеке?
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Фасм так скомпилил
    Код (Text):
    1. 00401000 $  BD 01000000   MOV     EBP,1
    2. 00401005 .  803C2F 01     CMP     BYTE PTR DS:[EDI+EBP],1
    3. 00401009 .  B9 01000000   MOV     ECX,1
    4. 0040100E .  803C0F 01     CMP     BYTE PTR DS:[EDI+ECX],1
     
  3. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Если EBP используется в качестве базового регистра, то обращения по умолчанию производятся к сегменту стека, указываемому в SS. Под виндой это пофиг, ибо flat, а вот под, например, DOS-extender'ом это надо не забывать.



    Без EBP на байт короче, т.к. к [bp/ebp] можно обратиться только как [...bp/ebp+0]. Объяснение этому -- структура байтов mod_reg_r/m и SIB в IA32.
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Попробовал явно указать

    cmp byte ptr ds:[edi+ebp],0

    Получил те же 2 байта для нуля, и опкод с приставкой 3E:.


    Код (Text):
    1. 004014A0   > BD 01000000         MOV EBP,1
    2. 004014A5   . 3E:807C3D 00 00     CMP BYTE PTR DS:[EBP+EDI],0




    ?

    В принципе 1 байт ничего не значит, просто неясно, почему. ebp должен адресовать кратное ворду?
     
  5. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Преффиксов переопределения сегмента тут вооюще нет, так что правильным будет вариант

    807C3D0000 - cmp byte ptr [ebp+edi], 00h

    803C3900 - cmp byte ptr [ecx+edi], 00h
     
  6. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759




    @#$%^&

    Посмотри кодирование ModRegR/m + SIB.
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Получается, фасм допускает более вольное обращение с кодами? А масм с этим строже.



    ModRegR/m - это что за фигня такая?
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257




    807C3D 00 00

    Т.е. сравнивается [ebp+0] c 0

    а не [ebp] с 00?
     
  9. zzzyab

    zzzyab New Member

    Публикаций:
    0
    Регистрация:
    13 май 2004
    Сообщения:
    115
    Да, адресации с ebp самим по себе нет, только с 8 или 32 битным смещением - такой формат. Сами по себе могут быть адресованы любые стандартные регистры кроме ebp и esp, esp вообще можно но только с байтом sib при этом размер инструкции такой же как и c ebp.
     
  10. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Код (Text):
    1. 004014A5   . 807C3D 00 00   CMP BYTE PTR SS:[EBP+EDI],0
    это известный баг masm.



    решение где-то приводил The Svin

    что-то вроде (не проверял)



    CMP BYTE PTR [1*EBP+EDI],0
     
  11. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    баг должен приводить к сбою. Но код не сбоит.

    Примерно с таким же основанием можно сказать, что это баг fasm - отсутствие нуля, если регистр должен быть со смещением, а фасм его не ставит :)
     
  12. Ykidia

    Ykidia Member

    Публикаций:
    0
    Регистрация:
    21 июн 2005
    Сообщения:
    99
    Адрес:
    Санкт-Петербург
    Насколько я понял, имеется в виду баг, попусту удлинняющий команду, но не изменяющий ее смысла, поэтому баг не приводит к сбою.

    Если компилятор подставляет лишний префикс там, где это не нужно, то это и есть баг компилятора.
     
  13. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Хорошим тоном для компиляторов ассемблера считается генерировать минимальный по размеру опкод, если обратное не форсировано модификаторами. Считать такое поведение masm багом или нет - личное дело каждого. IMHO плюсов masm это не прибавляет :derisive:
     
  14. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Как впрочем и фасму тоже это ничего не прибавляет.

    Малый размер - это для глистописателей :) Меня это не привлекает.

    А хороший тон - это отсутствие тона, я сам выберу тон, который нужен. Любителям хорошего тона можно посоветовать C++, delphi, visualbasic - там всё зафиксировано, запротоколировано и засунуто в рамки тона. Асм мне нужен для того, чтобы действовать по принципу "что хочу, то и ворочу".
     
  15. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia


    Он не будет сбоить если DS=SS там без разницы что базовый что индексный. Если о кодировании в Win32 то и в режиме супервизора и в пользовательском базы в дескрипторах у SS\DS равны 0. Но в режиме пользовательском у них вообще одни селекторы а в режиме ядра селекторы разные (это объясняется архитектурой не Win32 а I-32, у супервизора дескриптор стека не может иметь привилегии пользователя, у него там должен быть 0)

    Там когда разбирались в основном внимание было не на сбои кода а на размер инструкций,- у них получались разные размеры из-за специфики кодирования ebp как составляющей адреса. ebp в качестве базы будет обязательно с дисплейсментом, что раздражает когда можно обойтись без него в случаях index+base.
     
  16. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    cresta

    А ты че кипятишься то ;)

    ESP и EBP - "обиженные" регистры и обижены они не от хорошей жизни, а от нехватки битов кодировки ModR/M.

    Я вот только не пойму - ты пробовал вместо [ebp+edi] записать [edi+ebp] или тебе непременно хочется чтобы ebp был базой ?
     
  17. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    Хм, не знаю как можно с этого делать проблему для обсуждения. Вполне логично, что ассемблер первый указанный регистр считает базой, если не указан множитель. А ebp не может быть чистой базой, без смещения. На этом строятся такие команды как mov xxx, [reg*index+offset], т.е. SIB без базы.

    Вот, например, команда mov dword ptr [ebp+edi], 0

    скомпиленная тасмом:


    Код (Text):
    1. C7443D0000000000         mov       d,[ebp][edi][00000], 00


    а вот та же команда, но mov dword ptr [edi+ebp], 0

    результат


    Код (Text):
    1. C7042F00000000            mov       d,[edi][ebp], 00




    Т.е. переставить регистры => -1 байт.
     
  18. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Угу, это проблема Масма, там как не переставляй он ebp считает базой если множитель принудительно не поставить.
     
  19. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    cresta >




    Для такого подхода некоторые опкоды в masm придётся кодировать через DB :derisive:





    The Svin >




    И может привести к ошибкам, когда в алгоритмах каким-то образом используется размер опкода.
     
  20. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    leo

    Да не кипячусь я, просто S_T_A_S_

    постоянно шпыняет масм, а мне не нравится это :) И мне тоже хочется пнуть фасм.:)

    Собственно проблемы тут никакой нет, воткнуть db...и всё, если так уж необходимо урвать один байт. Просто заметил такой эффект и решил спросить, в чём дело. Для обчего развития :)