Имеется структура 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
Заходил, искал, увидел, как толпа русских переписывается на английском. Не нашел, но по мотивам прочитанного + метод тыка все-таки кое что выродил. Поскольку сам спрашивал, то сам и отвечу для увеличения энтропии Следующая структура дергается по ссылке _за_нее_, что меня устроило: 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 Благодарю за пинок в сторону форума фасма.