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

 WASM Phorum —› WASM.ASSEMBLER —› UNION в FASM

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


Дата: Июн 25, 2004 15:22:00 · Поправил: Безпощадный даос

Добрый день!
У меня такой вопрос: существует ли в фасме аналог масмовского оператора union? Например, как можно объявить вот такую вещь:
STRUCT somestruct
  UNION 
    var1 dd ?
    var2 dd ?
  ENDS
  var3 dd 0
  var4 dd 0
ENDS


Дело в том, что я сейчас переделываю некоторые заголовочные файлы из Си, а там union активно используется. Вообще, возможно ли это?


Дата: Июн 25, 2004 15:58:14

union или аналога в FASM нет.
Возможно написать для таких целей макрос, но imho проще делать так:
STRUC somestruct
{
;  UNION 
label    var1 dword
    var2 dd ?
;  ENDS
  var3 dd 0
  var4 dd 0
}


Дата: Июн 25, 2004 16:19:03 · Поправил: S_T_A_S_

Можно ещё так:
STRUCT	fix struc
ENDS	equ

macro	UNION [arg]
{
	common	local .size
		.size=0
	forward	virtual at 0
			arg
			if .size < $
				.size = $
			end if
		end virtual
	common	rb .size
}
Используем:
STRUCT	somestruct
{
	UNION \
		.var1 dd ?,\
		.var2 dd ?
	ENDS
	.var3 dd 0
	.var4 dd 0
ENDS
}


Дата: Июн 28, 2004 04:22:44

Monk
Твой пример не отражает специфики объединения, т.к. под обе переменные резервируется одинаковое пространство.


Дата: Июн 28, 2004 09:13:28

А вот в фасме выкопал некий макрос:
; union macro
macro union _at, [_item, _type]
 {
	common
		virtual at _at
	forward
		_item _type
	common
		end virtual
 }


Это не оно? Что он вобще делает?


Дата: Июн 28, 2004 18:19:18

Строка:
union first,\
            sec,dd,\
            dal,db
first:

Развернётся в следующие строчки:
first:
 sec dd 0
 dal db 0

В общем макрос в приведённом виде не имеет ничего общего с Объединением. Однако если строки virtual at _at и end virtual поместить внутри forward то вероятно (не проверял) будет создано именно объединение т.е. несколько переменных по одному адресу.


Дата: Июн 28, 2004 18:36:53

Ещё необходимо выделить места столько, сколько занимает самый большой из аргумантов.
См. мой макрос выше.


Дата: Июн 28, 2004 20:26:25

ясно. спасибо.


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