MS VC++ и MASM - код не совпадает!

Тема в разделе "WASM.BEGINNERS", создана пользователем Stub, 29 янв 2007.

  1. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    Компилирую следующий код:
    Код (Text):
    1.  Imp = ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
    и соответственно
    Код (Text):
    1. mov edx, (IMAGE_NT_HEADERS PTR [edx]).OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress
    в результате генерируемый код расходится:
    Код (Text):
    1.     mov eax, DWORD PTR _ntHeaders$[ebp]
    2.     mov ecx, DWORD PTR [eax+128]
    3.     mov DWORD PTR _Imp$[ebp], ecx
    и
    Код (Text):
    1.     mov edx, DWORD PTR [edx+121]
    Что не так?
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Stub
    В первом случае:
    DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]
    DataDirectory + IMAGE_DIRECTORY_ENTRY_IMPORT * sizeof(IMAGE_DATA_DIRECTORY)
    DataDirectory + 1 * 8
    DataDirectory + 8

    Во втором:
    DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]
    DataDirectory + IMAGE_DIRECTORY_ENTRY_IMPORT
    DataDirectory + 1

    Отсюда разница в 7.
     
  3. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    Quantum
    А почему MASM неправильно это делает?
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    у Iczelion'а приблизительно так:
    Код (Text):
    1. assume edi:ptr IMAGE_NT_HEADERS
    2. .IF [edi].Signature == IMAGE_NT_SIGNATURE
    3.    mov edi, [edi].OptionalHeader.DataDirectory[sizeof IMAGE_DATA_DIRECTORY].VirtualAddress
     
  5. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    Quantum, Asterix
    Спасибо за помощь - сделал
    Код (Text):
    1. mov edx, [edx].OptionalHeader.DataDirectory[sizeof IMAGE_DATA_DIRECTORY*IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress
    и теперь все нормально :)
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Потому что это ассемблер, а не си. И в нём высчитывание смещений в таких конструкциях сделан упрощённо.
     
  7. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    IceStudent
    понял, моя ошибка :)