|
|
| Посл.отвђт | Сообщен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 |