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

 WASM Phorum —› WASM.ASSEMBLER —› Инициализация структур в FASM'e при создании

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


Дата: Окт 28, 2004 22:02:02 · Поправил: Johnikum

Добрый вечер.

Как в FASM'е инициализировать структуру в коде как это делается в MASM'е:
.data
pos POINT <100,100>

При попытке компиляции
pos POINT 100,100
FASM ошибку выдает:
Fasm выдает ошибку:
pos POINT 100,100
error: invalid macro arguments.

Я так понимаю нужно описывать структуры в виде:
struc point x,y
{
   .x dw x
   .y dw y
}

Но ввиду того, что структур много, менять их нет возможности.
Как это можно решить?

PS. Заполнять структуры в коде mov'ами не выход.


Дата: Окт 28, 2004 22:15:38

;===================================================================== ==
На board.flatassembler читал, что свою структуру объявлять примерно так:
;===================================================================== ==
struc       POINT  x,y {
     .x     dw x
     .y     dw y
}
;===================================================================== ==
virtual     at 0
POINT       POINT ?,?
sizeof.POINT = $
end         virtual
;===================================================================== ==
macro       POINT x,y {
local       lbl
lbl         POINT x,y
}
;===================================================================== ==
Потом можно использовать:
;===================================================================== ==
pos         POINT 100,100
;===================================================================== ==
Как по другому, х.з., наверное можно покороче
;=======================================================================


Дата: Окт 28, 2004 22:26:32

В том то и дело, что в этом случае к каждому описанию структуры надо прикручивать список параметров и менять
.x dd ? на .x dd x .
Только вот структур много.


Дата: Окт 28, 2004 22:37:43

Я тебя понял, мне тоже лишние мувы не нужны, а структур действительно дофига в win32api, на ум пока приходит только:
store 100 at pos.x
store 100 at pos.y
Но всеравно х-ня, я не спец ещё в фасме


Дата: Окт 28, 2004 23:22:12 · Поправил: Turkish

легче всего написать так:
pos:
.x dd 100
.y dd 100

или оформить в виде макроса
macro POINT sname,x,y
{
sname:
.x dd x
.y dd y
}

только тогда использовать так POINT pos,100,100


Дата: Окт 29, 2004 07:09:11

> „Но ввиду того, что структур много, менять их нет возможности. “

IMHO можно написать какой-нить скрипт, который пропарсит стандартные include и приведют все структуры к виду:
struc point x,y
{
   .x dw x +0
   .y dw y +0
}

Тогда можно будет использовать их как с параметрами, так и без.


Дата: Окт 29, 2004 21:25:55

Так не получится. struc - тоже макрос, пришить ему дополнительные параметры нельзя.


Дата: Окт 29, 2004 21:45:50

Turkish Почему? Вроде работает
;========================================================
struc      POINT x,y
{
  .x dd x +0
  .y dd y +0
}
;========================================================
struc      MSGS hwnd,message,wParam,lParam,time,pt.x,pt.y
{
  .hwnd    dd hwnd    +0
  .message dd message +0
  .wParam  dd wParam  +0
  .lParam  dd lParam  +0
  .time    dd time    +0
  .pt      POINT      pt.x,pt.y
}
;========================================================
wMsg       MSGS 1,2,3,4,5,0Ah,0Bh
;========================================================


Дата: Окт 30, 2004 07:45:59

Да, struc - это тот же макро, значит обрабатывается на стадии препроцессора.
Например:
struc      POINT x,y
{
  .x dd x +0
  .y dd y +0
}

foo POINT 50,60

;будет преобразовано в

foo:
  .x dd 50 +0
  .y dd 60 +0


bar POINT

;будет преобразовано в

bar:
  .x dd  +0
  .y dd  +0


Дата: Окт 31, 2004 03:09:11

Вот такое работает:
macro initStruc name,[var,size]
{
common
local cu
cu=0
forward
store size var at name+cu
if size eq dword
cu=cu+4
end if
if size eq word
cu=cu+2
end if   
if size eq byte
cu=cu+1
end if   
};initStruc
;endm

Используем так:
struc ns
{
.f dd 3
.s db 0
};ns
;ends

newst ns

initStruc newst,\
                12,dword,\
                15,byte

Набросал и проверил по быстрому, могут быть ошибки, работатьбудет в FASM 1.52 и выше.


Дата: Окт 31, 2004 20:25:41

Написал парсер, который преобразовывает структуры к виду
struc      POINT x,y
{
  .x dd x +0
  .y dd y +0
}

Пока правда не обрабатываются вложенные структуры.

И еще одна неопределенность...
есть такая структура (просто пример):
struc MESS
{
  .szMes  rb 4
  .idMes  dd ?
}


Если инициализировать такую из описания структуры, то без дополнительного макроса не обойтись.
Метод:
message MESS
store '0123' at message.szMes ; - это тоже не проходит - ругается компилятор

Если инициализировать так:
MESS.message:
   .szMes db '111'
   .idMes dd -1

то все данные "съедут" - в откомпилированном будет нечто типа:
31 31 31 FF FF FF FF
хотя должно было бы быть:
31 31 31 00 FF FF FF FF

Я вижу только один способ - оставить все на совесть человека :)), а инициализировать так:
struc MESS ,idMes ; - первый параметр опускать
{
  .szMes  rb 4
  .idMes  dd idMes + 0
}


Дата: Ноя 1, 2004 08:56:14

Может быть, так:
struc MESS Mes,idMes
{
virtual
  .szMes  rb 4
end virtual
  .Mes    dd Mes +0
  .idMes  dd idMes +0
}

foo MESS 'wasm',$

или так
struc MESS Mes,idMes
{
  .Mes    dd Mes +0
  .idMes  dd idMes +0
label .szMes byte at .Mes
}


Дата: Ноя 1, 2004 20:38:09

4 байта это было образно...
а если структура такая:
struc MESS
{
  .szMes  rb 37     ; (здесь любое число)
  .idMes  dd ?
}

то как быть? что то я верных вариантов не нашел


Дата: Ноя 2, 2004 01:44:58 · Поправил: Johnikum

Вот вроде так:
macro rs len_field,arg
{
  if len_field eq
     display "ERROR!"
     .ERR
  end if
  local ..len_arg
  local ..arg
  if arg eq
     ..len_arg = 0
     ..arg equ arg
  else
     ..arg equ arg
     virtual at 0
        db ..arg
        ..len_arg = $
     end virtual
  end if
  if ..len_arg > len_field
     display "ERROR!",10
     .ERR
  else
     db ..arg
     rb len_field - ..len_arg
  end if
}
;Использовать так:
struc MESS Mes,idMes
{
  .Mes:   rs 10,Mes
  .idMes  dd idMes +0
}
foo MESS 'Assembler!',-1

Только вот как на автомате определить, строка ли имелась ввиду в структуре...


Дата: Ноя 6, 2004 02:41:30

В аттаче структуры (из стандартного дистрибутива fasm) с добавленной возможностью инициализации.
Макросы необходимые для этого прилагаются.
Там же и примеры с пояснениями.

О возможных ошибках прошу сообщать в этот топ.

_1017909889__strucs.rar


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