Грабли со строковыми командами

Тема в разделе "WASM.ASSEMBLER", создана пользователем Rockphorr, 26 май 2006.

  1. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    В masm существует 5 мнемоник префиксов повторения rep, repe repz repne repnz

    Сколько им соответствует опкодов ??

    Я экспериментально выяснил, что 2, другими словами

    rep заменяется или на repne или repe например опкод rep movsb соответствует repe movsb как показывают отладчики.

    Однако, masm ругается на конструкцию repe movs вне зависимости от суффикса размера.

    Печальный путающийся под ногами факт.
     
  2. asd

    asd New Member

    Публикаций:
    0
    repe/ne =repz/nz просто записи разные.

    А что печального в том, что rep на что-то меняется ?
     
  3. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Плохо то, что repe не желает распознаваться.

    На счёт остального asd прав.

    repz распознаётся?
     
  4. HitmaN85

    HitmaN85 New Member

    Публикаций:
    0
    Если в команде высолняется сравнение cmps scas, то префиксы будут repe/repne. Если сравнения не требуется, то любой префикс повторения будет воспринят как rep.

    Остальное уже проблемы компиляторов и отлидчиков.
     
  5. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    asd

    repe/ne =repz/nz - тривиально в любом учебнике написано



    грабли в другом, что в листингах полученных из отладчиков и дисасмов приходится вылавливать и заменять repe на rep перед movs
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    -1 в пользу масма :)
     
  7. r90

    r90 New Member

    Публикаций:
    0


    а чего там вылавливать?
    Код (Text):
    1. $ sed -i 's/repe\(\s*\)movs\(.*\)/rep\1movs\2/' *asm


    вот intel в at&t или наоборот, довольно сложно конвертнуть, а такие мелочи...
     
  8. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    если УНИХ то да, но у нас MSDOS
     
  9. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    Rockphorr
    Вот я компелирую:
    Код (Text):
    1. .386
    2. option casemap:none
    3. .model flat,stdcall
    4. .code
    5. start:
    6.     rep movsb
    7. end start
    Генериться код:
    Код (Text):
    1. F3:A4          REP MOVS BYTE PTR ES:[EDI],BYTE PTR [ESI]
    И никакой не REPE
    Если компелировать
    Код (Text):
    1. .386
    2. option casemap:none
    3. .model flat,stdcall
    4. .code
    5. start:
    6.     repe movsb
    7. end start
    ,то masm ругнется естественно
    , т.к. префикс repe не поддерживается командой movsb. И никакие префиксы размера тут не причем.
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Это у масма не поддерживается. Компилировал фасмом.
    Код (Text):
    1. .00011050: F3A4                         repe        movsb
    (hiew)
     
  11. Bill_Prisoner

    Bill_Prisoner New Member

    Публикаций:
    0
    IceStudent
    Нет, это и не должно поддерживаться по логике машинных команд. Но с другой стороны это подчеркивает гибкость фасма и деревянность масма. В фасме можно просто написать:
    Код (Text):
    1. repe repne repe repe repne rep repe repne movsb
    или что-то вроде того и все замечательно скомпилиться в отличие от масма. Но любому ассемблерщику думаю больше понравиться подход фасма, ведь ассемблер призван быть максимально гибким.
     
  12. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Bill_Prisoner

    то что генериться по исходнику это одно а то что в результате реверса это совсем другое
    проблема тут только в утомительности замен repe на rep для masm
     
  13. Dima_X

    Dima_X New Member

    Публикаций:
    0
    Rockphorr
    repe и rep это разные префиксы по логике. Зачем их заменять?