Доступ к членам структуры по ее адресу.

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

SL
Сообщения: 8
Зарегистрирован: 21 янв 2005, 22:52

Подскажите пожалуйста, как достучаться до членов стуктуры, если известен ее адрес.
В частности, из метода класса.
Аватара пользователя
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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
SL
Сообщения: 8
Зарегистрирован: 21 янв 2005, 22:52

Попробовал ваше решение:

Код: Выделить всё

	add edi, offset y
**Error** test.ASM(18) Undefined symbol: y
Я использовал TASM5 и TASM4.1, режимы IDEAL и MASM - никак не работает.
Может дело в опциях компилятора?
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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
SL
Сообщения: 8
Зарегистрирован: 21 янв 2005, 22:52

Romeo писал(а):Если я не ошибаюсь, то можно просто написать my_st.y
Ты не ошибаешься, если под m_st понимать имя переменной, структуры, но мне известен только ее адрес. Я пробовал писать MY_STRUCT.y - не пропускает. Неужели придется зашиваться на размер членов? :) ... :(
А что у тебя под рукой? :) Разве в других ассемблерах доступ к членам структур другой?

P.S. 2Romeo: мы тут поспорили, твоя подпись не от Б.Страуструпа?
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

Подскажите пожалуйста, как достучаться до членов стуктуры, если известен ее адрес.
В частности, из метода класса.
Ну, дабы не усложнять, про классы мы разговор вести не будем.
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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
SL
Сообщения: 8
Зарегистрирован: 21 янв 2005, 22:52

Andy писал(а):Romeo, SL, у вас ошибки в объявлении.
Спасибо, действительно скобок не надо. Но компилятор такое пропускал.
Объявление написано в режиме IDEAL, одно из отличий которого - имя структуры и т.п. надо писать после служебного STRUC.

Код: Выделить всё

mov   ax,xy_struc.x
Синтаксис безупречен. :) И компилируется!
Но это, к сожалению, не решает моей проблемы. Проблема в том, что (допустим, в области видимости) нет xy_struc, есть только ее адрес.
Andy писал(а):Не занимайтесь ерундой молодой человек
Рад бы последовать вашему совету. Но это необходимо. Не мне. Я б на это давно забил. Диплом пишу. Руководитель приговорил показать пример потомкам - написать все на IDEAL.

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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

Но это, к сожалению, не решает моей проблемы. Проблема в том, что (допустим, в области видимости) нет 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
Ответить