Страница 1 из 2

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

Добавлено: 23 янв 2005, 21:51
SL
Подскажите пожалуйста, как достучаться до членов стуктуры, если известен ее адрес.
В частности, из метода класса.

Добавлено: 24 янв 2005, 10:51
Romeo

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

stuct   MY_STRUCT
x         dw        (?)
y         dw        (?)
ends

...

mov di, offset my_struct
add di, offset y
mov ax, [di]

Добавлено: 24 янв 2005, 18:31
SL
Попробовал ваше решение:

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

	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 почему-то не хочет такое принимать.

Добавлено: 24 янв 2005, 19:09
Romeo
Извиняюсь, нет под рукой TASM, потому в синтаксисе могу ошибаться. Если я не ошибаюсь, то можно просто написать my_st.y

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

P.S. 2Romeo: мы тут поспорили, твоя подпись не от Б.Страуструпа?

Добавлено: 25 янв 2005, 01:03
Andy
Подскажите пожалуйста, как достучаться до членов стуктуры, если известен ее адрес.
В частности, из метода класса.
Ну, дабы не усложнять, про классы мы разговор вести не будем.
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 почему-то не хочет такое принимать.
Не занимайтесь ерундой молодой человек - не усложняйте сущности без надобности © :) :) :)

Добавлено: 25 янв 2005, 11:23
Romeo
А что у тебя под рукой? Разве в других ассемблерах доступ к членам структур другой?
В том-то и дело, что под рукой у меня НИЧЕГО нет, SL. Поэтому и ошибки в объвлении, уж не обессудьте, господин Andy. Отсюда же и долгая возня вместо краткого чёткого ответа.
Мы тут поспорили, твоя подпись не от Б.Страуструпа?
Ещё раз заявляю вовсеуслышание и на добрую половину страны: моя "подпись" от Вильяма Окама. Метод действия, в основе которого положена эта концепция, имеет название принцип лезвия Окама. Т.е. из всех возможных гипотез отбрасываются самые сложные и надуманные. В оригинале звучит так:

"Entites should not be multiplied beyond necessity"
- William Occam

Естественно гениальный Окама применял свой принцип не для computer science, но я не удержался, очень уж подходит.

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

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

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

P.S. 2Romeo: Спасибо за ценную информацию. Однако спор я проиграл. :) Видимо Страуструп цитировал Окаму.

Добавлено: 25 янв 2005, 18:23
Romeo
Проблема в том, что ни один язык программирования, даже высокоуровневый, в том числе и С++, не может обращаться к элементам структуры, если он об этой структуре ничего не знает. Не тем методом пытаетесь решить проблему, господин SL. Нужно просто везде обеспечить эту так называемую (цитирую) "область видимости" (хотя этот термин применяется в прораммировании несколько в другом контексте). Для этих целей есть header файлы. Т.е. помещаем структуру в отдельный файл INC и инклюдим её в каждом файле, который требует о ней "знать".

Добавлено: 25 янв 2005, 23:28
Andy
Но это, к сожалению, не решает моей проблемы. Проблема в том, что (допустим, в области видимости) нет 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