Код (Text): VEC struct x dd ? y dd ? VEC ends PARTICL struct pos VEC <> .................... PARTICL ends .data mas PARTICL 50 dup( <> ) .code lea di, mas mov [di].pos.x, eax Пытаюсь получить доступ к элементу по пути mas[0]->pos->x , но компилятор(Masm32) не хочет компилировать. *error A2006: undefined symbol : pos*. Подскажите пожалуйста что я делаю неправильно?
Код (Text): lea eax, mas assume eax: PTR PARTICL mov [eax].pos.x, ebx заработало, спс. и ещё вопросик: есть ли разница между mov eax, offset mas и lea eax, mas ? если есть то какая ?
И всё же вопрос остаётся открытым. В *Практикуме* от Юрова есть пример работы с массивом структур. Я делаю почти тоже самое: Код (Text): VEC struct x dd ? y dd ? VEC ends PARTICL struct pos VEC <> .................... PARTICL ends .data mas PARTICL 50 dup( <> ) .code lea eax, mas mov ecx, type PARTICL <цикл 10 повторений> mov [eax].pos.x, ebx add eax, ecx <конец цикла> но у меня всё равно выскакивает при компиляции *error A2006: undefined symbol : pos* %)
lea eax, mas ; можно получить адрес локальной переменной, а mov - нет. LEA - рулезная инструкция. IMHO.
отдельного элемента pos как такового не существует - у тебя он объявлен только в контексте mas. Так что или используй assume, или обращайся через [eax].PARTICL.pos.x
lea - просто операция сложной мат операции, но описана почемуто только по побочному эффекту - возможности рассчетуа сложных адресов (локальных, массивов итд) одной командой. Для загрузки числа в регистр - разницы никакой, окромя того, что леа длиннее на байт и, не помню точно, тормознутее.