Доступ к членам структуры по ее адресу.
Модератор: Andy
Подскажите пожалуйста, как достучаться до членов стуктуры, если известен ее адрес.
В частности, из метода класса.
В частности, из метода класса.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Код: Выделить всё
stuct MY_STRUCT
x dw (?)
y dw (?)
ends
...
mov di, offset my_struct
add di, offset y
mov ax, [di]
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Попробовал ваше решение:
Я использовал TASM5 и TASM4.1, режимы IDEAL и MASM - никак не работает.
Может дело в опциях компилятора?
tasm32.exe /m3 /ml /zi /z %1
Если у Romeo работает то, что он написал, значит, у меня где-то ошибка.
Вот компилируемый файл:
???
P.S. Обратите внимание на объявление структуры. IDEAL почему-то не хочет такое принимать.
Код: Выделить всё
add edi, offset y
**Error** test.ASM(18) Undefined symbol: y
Может дело в опциях компилятора?
tasm32.exe /m3 /ml /zi /z %1
Если у Romeo работает то, что он написал, значит, у меня где-то ошибка.
Вот компилируемый файл:
Код: Выделить всё
P386
LOCALS @@
MODEL flat
IDEAL
STRUC MY_STRUCT
x dd (?)
y dd (?)
ENDS MY_STRUCT
DATASEG
MASM ; IDEAL глючит при объявлении структур
my_struct MY_STRUCT <>
CODESEG
IDEAL
_start:
mov edi, offset my_struct
add edi, offset y
mov eax, [edi]
ret
end _start
P.S. Обратите внимание на объявление структуры. IDEAL почему-то не хочет такое принимать.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Извиняюсь, нет под рукой TASM, потому в синтаксисе могу ошибаться. Если я не ошибаюсь, то можно просто написать my_st.y
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ты не ошибаешься, если под m_st понимать имя переменной, структуры, но мне известен только ее адрес. Я пробовал писать MY_STRUCT.y - не пропускает. Неужели придется зашиваться на размер членов?Romeo писал(а):Если я не ошибаюсь, то можно просто написать my_st.y


А что у тебя под рукой?

P.S. 2Romeo: мы тут поспорили, твоя подпись не от Б.Страуструпа?
Ну, дабы не усложнять, про классы мы разговор вести не будем.Подскажите пожалуйста, как достучаться до членов стуктуры, если известен ее адрес.
В частности, из метода класса.
Romeo, SL, у вас ошибки в объявлении.
Код: Выделить всё
my_struc struc
x dw ?
y dw ?
my_struc ends
xy_struc my_struc <0,0>
mov ax,xy_struc.x
mov bx,xy_struc.y
ЗЫ.
Не занимайтесь ерундой молодой человек - не усложняйте сущности без надобности ©IDEAL почему-то не хочет такое принимать.



*provided AS IS
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
В том-то и дело, что под рукой у меня НИЧЕГО нет, SL. Поэтому и ошибки в объвлении, уж не обессудьте, господин Andy. Отсюда же и долгая возня вместо краткого чёткого ответа.А что у тебя под рукой? Разве в других ассемблерах доступ к членам структур другой?
Ещё раз заявляю вовсеуслышание и на добрую половину страны: моя "подпись" от Вильяма Окама. Метод действия, в основе которого положена эта концепция, имеет название принцип лезвия Окама. Т.е. из всех возможных гипотез отбрасываются самые сложные и надуманные. В оригинале звучит так:Мы тут поспорили, твоя подпись не от Б.Страуструпа?
"Entites should not be multiplied beyond necessity"
- William Occam
Естественно гениальный Окама применял свой принцип не для computer science, но я не удержался, очень уж подходит.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Спасибо, действительно скобок не надо. Но компилятор такое пропускал.Andy писал(а):Romeo, SL, у вас ошибки в объявлении.
Объявление написано в режиме IDEAL, одно из отличий которого - имя структуры и т.п. надо писать после служебного STRUC.
Код: Выделить всё
mov ax,xy_struc.x

Но это, к сожалению, не решает моей проблемы. Проблема в том, что (допустим, в области видимости) нет xy_struc, есть только ее адрес.
Рад бы последовать вашему совету. Но это необходимо. Не мне. Я б на это давно забил. Диплом пишу. Руководитель приговорил показать пример потомкам - написать все на IDEAL.Andy писал(а):Не занимайтесь ерундой молодой человек
P.S. 2Romeo: Спасибо за ценную информацию. Однако спор я проиграл.

- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Проблема в том, что ни один язык программирования, даже высокоуровневый, в том числе и С++, не может обращаться к элементам структуры, если он об этой структуре ничего не знает. Не тем методом пытаетесь решить проблему, господин SL. Нужно просто везде обеспечить эту так называемую (цитирую) "область видимости" (хотя этот термин применяется в прораммировании несколько в другом контексте). Для этих целей есть header файлы. Т.е. помещаем структуру в отдельный файл INC и инклюдим её в каждом файле, который требует о ней "знать".
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ну может тогда типа следующего?Но это, к сожалению, не решает моей проблемы. Проблема в том, что (допустим, в области видимости) нет xy_struc, есть только ее адрес.
Код: Выделить всё
my_struc struc
x dw ?
y dw ?
my_struc ends
xy_struc my_struc <0,0>
....
mov di,offset my_struc ; адрес
mov ax,word ptr [di] ; x
mov bx,word ptr [di + 2] ; y
*provided AS IS