Итак, имеем union, описанный на С примерно так:
Код
union a_t
{
struct
{
uint16_t a;
uint8_t b;
uint16_t c;
};
struct
{
uint8_t d;
uint16_t e;
uint8_t f;
};
} A;
Для ИАРа делается просто:
Код
RSEG MYDATA : DATA(0)
A:
a DS 2
b DS 1
c DS 2
ORG 0
d DS 1
e DS 2
f DS 1
теперь
LDI R30, LOW(A)
LDI R31, HIGH(A)
LD R16, Z+ (a - A) + 0
LD R17, Z+ (a - A) + 1
LD R18, Z+ (b - A)
А у гнутого асма .org работает иначе, им нельзя сдвинуть location counter назад и как мне организовать что-то эквивалентное - не могу придумать. Делать
Код
A:
.skip 4,0
.set a, A + 0
.set b, a + 2
.set c, b + 1
.set d, A + 0
.set e, d + 1
.set f, e + 2
не хочется, ибо и размеры переменных неочевидны и нет автоматического резервирования места (если добавить переменную и забыть исправить .skip - будут неприятности). Возможно есть все же какое-то красивое решение?