[an error occurred while processing this directive]
Fujitsu MB90 + Softune 3.5 (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено e-not 01 ноября 2005 г. 16:33

Во внешней памяти находится массив неких структур. Анализ ассемблерного кода в отладчике показывает, что если элемент структуры 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: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru