FASM: как адресовать структуру адресом последнего элемента в ней

Тема в разделе "WASM.ASSEMBLER", создана пользователем DimB, 10 ноя 2006.

  1. DimB

    DimB New Member

    Публикаций:
    0
    Регистрация:
    21 авг 2006
    Сообщения:
    2
    Имеется структура
    struct RList
    Capacity dd ?
    Count dd ?
    pItems dd ? ; указатель на первый элемент списка
    ends
    и определение
    virtual at ebp
    rlebp RList ?
    end virtual
    Работа с таким списком ведется примерно так:
    mov eax,sizeof.RList
    call AllocMem
    mov ebp, eax ; родили структуру
    mov [pList], eax ; где-то будет жить указатель на нее
    mov eax, $288 ; пусть столько
    mov [rlebp.Capacity], eax
    call AllocMem
    mov [rlebp.pItems] ,eax ; указатель на часть мозга, где будут лежать $288 Items
    ...........
    mov ebp, [pList] ; будем что-то делать со списком
    mov eax, [rlebp.pItems]
    mov [rlebp.Count],1
    mov [eax], $ffffffff ; элемент списка
    .......... ; и далее пошла веселуха в том же духе

    Эта схема организации списков слизана из Delphi KOL. Первый недостаток - под структуру и элементы надо отдельно выделять память - привет фрагментация. Второй - для общения со списком используются два регистра (здесь ebp и eax) - а их в процессоре оказалось считаное количество, в смысле лишних не бывает.
    Более правильно, наверное, будет хранить элементы а перед ними в той же области памяти сужебную структуру. Идея такая (синтаксис конечно неверен):
    struct pList
    Capacity dd ?
    Count dd ?
    Items dd ? ; на самом деле не dd, а область растет вниз через ReallocMem(List)
    ends
    virtual at ebp
    rlebp pList.Items ? ; а как ?
    end virtual

    Как с помощью синтаксиса FASM, сделать так, чтобы ссылка на List была эквивалентна ссылке на List.Items, а адресация была так же проста? т.е.
    mov ebp,
    • ;
      mov [ebp], $ffffffff ; попаcть в pList.Items
      mov [rlebp.Count],1 ; чтоб было эквивалентно mov [ebp-4], 1
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Такое решение было.. Не помню уже, как. Поищи на форуме фасма.
     
  3. DimB

    DimB New Member

    Публикаций:
    0
    Регистрация:
    21 авг 2006
    Сообщения:
    2
    Заходил, искал, увидел, как толпа русских переписывается на английском. Не нашел, но по мотивам прочитанного + метод тыка все-таки кое что выродил.
    Поскольку сам спрашивал, то сам и отвечу для увеличения энтропии :)
    Следующая структура дергается по ссылке _за_нее_, что меня устроило:
    struc RList
    {
    virtual at $-.bsize
    .baseaddr: ; для красоты и удобства управления памятью
    .capacity dd ?
    .count dd ?
    .bsize = $-.baseaddr
    end virtual
    }

    virtual at 0
    RList RList
    end virtual

    virtual at eax
    rleax RList
    end virtual
    ...
    mov [rleax], $ffffffff ; пуляем в первое dd за структурой = [eax]
    mov [rleax.count], 1 ; компилится в mov [eax-4], 1

    Благодарю за пинок в сторону форума фасма.