Почему я не могу так обращаться к полям структуры Код (Text): SOMERECORD STRUCT dwSize DWORD ? pData PBYTE ? SOMERECORD ENDS PSOMERECORD TYPEDEF PTR SOMERECORD ... SomeProc PROC pRecord: PSOMERECORD .if pRecord.dwSize == 10 ... .endif RET SomeProc ENDP Как в таком случае правильно поступать? Кроме как: Код (Text): MOV EAX, pRecord assume EAX : PTR SOMERECORD .if [EAX].dwSize == 10 ... .endif
это только указатель, а не сама структура. На асме это должно было выглядеть примерно так: Код (Text): mov [[ebp+xxx].dwSize],yyy такой адресации в ассемблере нет, поэтому твой второй вариант единственно правильный
А чем тебе не нравится вариант с assume? Можно еще вот так: Код (Text): MOV EAX, pRecord .if [EAX].SOMERECORD.dwSize == 10 ... .endif
MSoft Я понимаю, но почему тогда нельзя так Код (Text): .if [pRecord].dwSize == 10 а так можно Код (Text): if [SOMERECORD PTR pRecord].dwSize == 10
Поправьте меня, если я не прав, то этот код не верен, т. е. сравнивается не поле структуры, а значение из стека (.dwSize - 1-вый аргумент функции = адрес структуры, .pData - 2-рой не существующий аргумент)
Arthur ты прав разве что компилятор переделает это в правильный код (как например масм автоматом умеет делать стековый кадр) LL, посмотри, как твой код будет выглядеть на чистом ассемблере (без имен) и ты поймешь, почему так нельзя писать - просто попробуй составить такой код полностью руками. А еще лучше - загляни в отладчик и увидишь, что твой код работает неправильно (ну или компилятор прописал совершенно другой код)
Компилятор должен знать в какой регистр поместить указатель на эту структуру, а задать его нельзя. Поэтому нужно вручную его поместить в регистр.