ООП на TASM в режиме IDEAL. Помогите.

Тема в разделе "WASM.ASSEMBLER", создана пользователем aaleksander, 8 сен 2004.

  1. aaleksander

    aaleksander New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2004
    Сообщения:
    11
    хочу создать объект на тасме и пишу такой код:

    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? Уже все перепробовал - никакой реакции
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    aaleksander

    Это, что еще за edi.cOut ?

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

    aaleksander New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2004
    Сообщения:
    11
    Вроде бы нет. В edi, сидит адрес экземпляра класса (lea edi, @@CBase). Проблемма в переходе на режим IDEAL, у него синтаксис немного другой. Вот и запутался.
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    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):
    1. mov (CBase ptr [edi]).cOut,eax
    2. mov CBase([edi]).cOut,eax
    3. mov CBase[edi].cOut,eax
    4. mov [edi].CBase.cOut,eax
    PS: еще один "железный", или "дубовый" вариант:

    mov dword ptr [edi+CBase.cOut], eax
     
  5. aaleksander

    aaleksander New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2004
    Сообщения:
    11
    Вся идея была в том, что это режим IDEAL. Уже разобрался, оказывается надо было писать так:

    mov [edi+CBase.cOut], eax



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