структура

Тема в разделе "WASM.BEGINNERS", создана пользователем LL, 11 дек 2008.

  1. LL

    LL New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    3
    Почему я не могу так обращаться к полям структуры

    Код (Text):
    1.   SOMERECORD STRUCT
    2.     dwSize DWORD ?
    3.     pData PBYTE ?
    4.   SOMERECORD ENDS
    5.   PSOMERECORD TYPEDEF PTR SOMERECORD
    6.  
    7.   ...
    8.  
    9.   SomeProc PROC pRecord: PSOMERECORD
    10.   .if pRecord.dwSize == 10
    11.     ...
    12.   .endif
    13.   RET
    14.   SomeProc ENDP
    Как в таком случае правильно поступать? Кроме как:
    Код (Text):
    1. MOV EAX, pRecord
    2. assume EAX : PTR SOMERECORD
    3. .if [EAX].dwSize == 10
    4.   ...
    5. .endif
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    это только указатель, а не сама структура. На асме это должно было выглядеть примерно так:
    Код (Text):
    1. mov [[ebp+xxx].dwSize],yyy
    такой адресации в ассемблере нет, поэтому твой второй вариант единственно правильный
     
  3. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    А чем тебе не нравится вариант с assume?
    Можно еще вот так:
    Код (Text):
    1. MOV EAX, pRecord
    2. .if [EAX].SOMERECORD.dwSize == 10
    3.   ...
    4. .endif
     
  4. LL

    LL New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    3
    MSoft
    Я понимаю, но почему тогда нельзя так
    Код (Text):
    1. .if [pRecord].dwSize == 10
    а так можно
    Код (Text):
    1. if [SOMERECORD PTR pRecord].dwSize == 10
     
  5. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Поправьте меня, если я не прав, то этот код не верен, т. е. сравнивается не поле структуры, а значение из стека (.dwSize - 1-вый аргумент функции = адрес структуры, .pData - 2-рой не существующий аргумент)
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Arthur
    ты прав
    разве что компилятор переделает это в правильный код (как например масм автоматом умеет делать стековый кадр)
    LL, посмотри, как твой код будет выглядеть на чистом ассемблере (без имен) и ты поймешь, почему так нельзя писать - просто попробуй составить такой код полностью руками. А еще лучше - загляни в отладчик и увидишь, что твой код работает неправильно (ну или компилятор прописал совершенно другой код)
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Компилятор должен знать в какой регистр поместить указатель на эту структуру, а задать его нельзя. Поэтому нужно вручную его поместить в регистр.
     
  8. LL

    LL New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    3
    Все понятно, спасибо.