хочу создать объект на тасме и пишу такой код: IDEAL struc CBase GLOBAL METHOD { constructor :dword = CBase_Constructor } cOut dd ? ends proc CBase_Constructor pascal near ARG @@CBase: dword, @@hConsole: dword USES eax, edi lea edi, [@@CBase] mov eax, [@@hConsole] mov [edi.cOut], eax <<<<<<<<<<<<<<<<<<<<< ret endp На отмеченную строку компилятор ругается :"Argument to operation or instruction has illegal size" Какой синтаксис у описания методов класса в режиме Ideal? Уже все перепробовал - никакой реакции
Вроде бы нет. В edi, сидит адрес экземпляра класса (lea edi, @@CBase). Проблемма в переходе на режим IDEAL, у него синтаксис немного другой. Вот и запутался.
aaleksander "Вроде бы нет" А вроде бы и ДА. Это тебе не pascal, а assembler. lea edi, [@@CBase] - это просто загрузка указателя @@CBase в регистр edi. Асму "пофиг" какого типа указатель в edi - это просто dword и ничего более. Поэтому "edi.cOut" никакого смысла не имеет. А правильный синтаксис такой mov (CBase ptr [edi]).cOut, eax т.е. берем нетипированный указатель на память [edi], приводим его к типу CBase и затем берем смещение на поле cOut с типом dd в соответствии с определением структуры CBase. За TASM не ручаюсь, а в Object Pascal build-in assembler, допустимы также следующие эквивалентные записи: Код (Text): mov (CBase ptr [edi]).cOut,eax mov CBase([edi]).cOut,eax mov CBase[edi].cOut,eax mov [edi].CBase.cOut,eax PS: еще один "железный", или "дубовый" вариант: mov dword ptr [edi+CBase.cOut], eax
Вся идея была в том, что это режим IDEAL. Уже разобрался, оказывается надо было писать так: mov [edi+CBase.cOut], eax Теперь другая проблемма: заполняю в конструкторе переменные класса. Когда вызывают другой метод из этого класса, то область переменных заполняется мусором. Если с по описанию ничего не понять, могу привести кусок кода.