Структуры STRUCT в sjasm/sjasmplus

Микропроцессоры и микроконтроллеры от фирмы Zilog, а также компьютеры на них построенные

Moderator: Shaos

DmitryMilk
Senior
Posts: 128
Joined: 12 May 2025 21:56

Структуры STRUCT в sjasm/sjasmplus

Post by DmitryMilk »

Кто-нибудь испольовал сабж?

Я как-то подзадолбался заниматься верчением констант/меток EQU для вычислений смещений к полям структур (особенно вложенных да и в массивах), и решил почувствовать себя белым человеком, чтоб всю черную работу по вычислению выполнял ассемблер.

С простыми случаями вроде понятно. Но мне простого недостаточно. Мне надо структуру S_RTCG_BUFFER, в которой одним из полей является структура S_RTCG_TABLE, в которой полями являются структуры S_RTCG_TABLE_ENTRY.

С описанием проблем нет. А вот с инициализацией - какая-то засада. В документации к sjasmplus написано, что для инициализации вложенных структур (именно уже определений объектов, а не деклараций структуры) надо использовать фигурные скобки, а поля - разделять запятыми.

имею такой раздел деклараций

Code: Select all

RTCG_FLAG_LDMASK1	equ	1	; flag C
RTCG_FLAG_LDMASK2	equ	64	; flag Z
RTCG_FLAG_END		equ	128	; flag S

RTCG_TEMPLATE_SIZE equ	8

	struct	S_RTCG_TABLE_ENTRY
flags		byte
bcnt		byte
start		word
	ends
	
	struct	S_RTCG_TABLE
p1		S_RTCG_TABLE_ENTRY
ep1		S_RTCG_TABLE_ENTRY
prlg1		S_RTCG_TABLE_ENTRY
i1		S_RTCG_TABLE_ENTRY
p2		S_RTCG_TABLE_ENTRY
ep2		S_RTCG_TABLE_ENTRY
prlg2		S_RTCG_TABLE_ENTRY
i2		S_RTCG_TABLE_ENTRY
end_marker	db	RTCG_FLAG_END
	ends
	
	struct	S_RTCG_BUFFER
masked_template	BLOCK	RTCG_TEMPLATE_SIZE * 2
table		S_RTCG_TABLE
	ends
и пытаюсь так создать объект типа S_RTCG_BUFFER, где masked_template мне инициализировать не надо, а вот table хочется иметь уже инициализированный

Code: Select all

rtcg_buffer	S_RTCG_BUFFER {
	,
	{
		{ RTCG_FLAG_LDMASK1, 1, 1000h },
		{ 0, 4, 1100h },
		{ RTCG_FLAG_LDMASK1, 5, 1180h },
		{ 0, 20, 1001h },
		{ RTCG_FLAG_LDMASK2, 5, 2000h },
		{ 0, 4, 2100h },
		{ RTCG_FLAG_LDMASK2, 5, 2180h },
		{ 0, 28, 2005h }
	}
}
Причем комилятор ругается где-то на предпоследней записи. Причем, если я убираю эти записи, начиная с которых он ругается - то компилируется, но инициализация применяется как-то странно:

Code: Select all

52    8010              rtcg_buffer	S_RTCG_BUFFER {
53    8010 00 00 00 00  	,
53    8014 00 00 00...
53    8020 00
54    8021 00 00 00     	{
55    8024 00 00 00 00  		{ RTCG_FLAG_LDMASK1, 1, 1000h },
55    8028 01 01 00 10
56    802C 00 04 00 11  		{ 0, 4, 1100h },
57    8030 01 05 80 11  		{ RTCG_FLAG_LDMASK1, 5, 1180h },
58    8034 00 14 01 10  		{ 0, 20, 1001h },
59    8038 40 05 00 20  		{ RTCG_FLAG_LDMASK2, 5, 2000h },
60    803C 00 04 00 21  		{ 0, 4, 2100h }
61    8040 80           	}
62    8041              }

То есть, с какой-то радости компилятор инициализирует первые две записи таблицы нулями, и только с третьей записи (8-й байт от начала таблицы) начинает использовать то, что я ему указал.

Что я делаю не так?