· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› ООП на TASM в режиме IDEAL. Помогите.

Посл.отвђт Сообщенiе


Дата: Сен 8, 2004 17:33:33

хочу создать объект на тасме и пишу такой код:
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? Уже все перепробовал - никакой реакции


Дата: Сен 8, 2004 23:14:23 · Поправил: leo

aaleksander
Это, что еще за edi.cOut ?
Может всетаки CBase[edi].cOut (или что-то в этом роде)


Дата: Сен 9, 2004 09:02:52

Вроде бы нет. В edi, сидит адрес экземпляра класса (lea edi, @@CBase). Проблемма в переходе на режим IDEAL, у него синтаксис немного другой. Вот и запутался.


Дата: Сен 9, 2004 10:26:58 · Поправил: leo

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, допустимы также следующие эквивалентные записи:
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


Дата: Сен 9, 2004 11:34:11

Вся идея была в том, что это режим IDEAL. Уже разобрался, оказывается надо было писать так:
mov [edi+CBase.cOut], eax

Теперь другая проблемма: заполняю в конструкторе переменные класса. Когда вызывают другой метод из этого класса, то область переменных заполняется мусором. Если с по описанию ничего не понять, могу привести кусок кода.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.087