[an error occurred while processing this directive]
|
Во внешней памяти находится массив неких структур. Анализ ассемблерного кода в отладчике показывает, что если элемент структуры char или int, то обращение к нему проходит через длинный указатель:
FooStruct->IntElem = 0xFFFF;
MOVL A,@RW3-08 //загрузили RL0
MOVL RL0,A
MOVW A,#FFFF //записали данные
MOVW @RL0+02,A
Это все хорошо. Но если элемент структуры long, то обращение к нему проходит через через ADB
FooStruct->LongElem = 0xAAAABBBB;
MOVL A,@RW3-08 //загрузили RL0
MOVW RW0,A
SWAPW //загрузили в ADB
MOV ADB,A //старшую половину адреса
MOVL A,#AAAABBBB
ADB
MOVL @RW0,A //записали данные
Это не есть хорошо, т.к. этот элемент может оказаться в разных сегментах. Попадался на это. Размер структуры 6 байт, т.е. выравнять по границам сегмента нельзя.
Т.к. в системе команд нет команды переноса 4-х байтного числа по длинному указателю, то надо бы заставить компилятор переносить его за 2 раза по 2 байта. Не придумал ничего лучше, как представить элемент long как union из 2-х int. Существует-ли правильное решение?
E-mail: info@telesys.ru