Про COM, 32 бит и 66h

Тема в разделе "WASM.BEGINNERS", создана пользователем DEEP, 11 янв 2009.

  1. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Заранее прошу прощения за ламерский вопрос. Писать СОМ пробую впервые.

    Скомпилил СОМ-прогу, использующую 32-разрядные регистры. Открываю её в CodeView - и, о чудо - он нихрена не видит! Считает что юзаются только 16-разрядные. Даже после включения флажка Options -> 32-Bit Registers. Открыл Калашникова - у него, на скриншотах дебагера, до 32-разрядных команд виден некий загадочный префикс 66h. Добавил себе в НЕХ-редакторе такие же - КодВью тут же перестал упрямиться.

    Так вот, внимание вопросы:
    1. что это за префикс?
    и, главное,
    2. как заставить СОМ прогу ассемблироваться с его автоматическим добавлением?
    а то как-то некошерно держать в листинге строчки типа db 66h =)

    [upd]: нда, таки поиск статей наконец-то дал результаты. Как оказалось, это префикс смены разрядности команды: в 16-разрядном режиме на 32 и наоборот.
    Так что первый вопрос отпадает.
    Остаётся второй и появившийся только что третий:

    3. а как этот префикс называется? Есть ли у него своё имя, наподобие LOCK, REP, итп?
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    DEEP
    Если в фасме, то не ставьте USE32 и тогда доступ к 32-битным регистрам будет автоматически предваряться префиксом 66h.
    Если в масме, то можно ставить OPTION SEGMENT:USE16. Либо в упрощённом объявлении ставьте директиву указания процессора после директивы .MODEL, а не перед. Тогда масм будет по умолчанию считать код 16-битным.
    Никаких подобий нет. Просто префикс переопределения разрядности операнда (66h) или адреса (67h). Разрядность по умолчанию определяется флагом D дескриптора сегмента (0 - 16 бит, 1 - 32 бита). Префиксы меняют разрядность на ту, которая не по умолчанию.
     
  3. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    о. спасибо! выручили!
    зы, а DWORD PTR [EAX]'ом так и давится, зарррраза. Упрямо пишет WORD PTR, хотя выполняет правильно, игнорируя две следующих фейковых команды %)

    ах да, и ещё один вопрос. Эта сволочь CodeView вообще гденибудь хранит настройки положения своих окон?
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    DEEP
    Для DWORD PTR [EAX] нужны оба префикса: для DWORD - 66h, а для [EAX] - 67h.
     
  5. DEEP

    DEEP Андрей

    Публикаций:
    0
    Регистрация:
    27 апр 2008
    Сообщения:
    491
    Адрес:
    г. Владимир
    Именно. Они там есть. И работа проги это подтверждает. Просто КодВью его не видит.
    зы. И выдаёт фейковые команды вместо второго слова.
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.709
    Код (Text):
    1. .286
    2. .model tiny
    3. .code
    4. org 100h
    5. ...
    6. .386<-- там где требуется
    7. rep movsd
    8. .286<-- восстанавливаю режим
    9. ...
    можно также использовать loopw/loopd, popfw/popfd, pushaw/pushad, по крайней мере, masm в зависимости от режима будет там где надо подставлять/убирать префикс 66h