Вопрос

Проходя свой первый курс ассемблера, меня расстраивают загадочные сообщения об ошибках во время отладки...Я признаю, что следующей информации будет недостаточно для установления причины проблемы (учитывая мое ограниченное понимание языка ассемблера ColdFire (MCF5307, семейство M68K)), но я с радостью прислушаюсь к любому совету.

...

jsr out_string

Ошибка адреса (формат 0x04 вектор 0x03 статус неисправности 0x1 статус reg 0x2700)

Я нашел аналогичный вопрос на http://forums.freescale.com/freescale/board/message?board.id=CFCOMM&thread.id=271, что касается ADDRESS ERROR в целом.

В ответе на вопрос говорится, что ошибка адреса связана с тем, что код «неправильно» пытается выполниться на невыровненной границе (или обращается к невыровненной памяти).

Итак, мои вопросы будут:

  1. Что означает «неправильная» попытка выполнить невыровненную границу/память?Если есть пример, это очень поможет

  2. Что такое неприсоединенная граница/память?

  3. Как бы вы подошли к решению этой проблемы, предполагая, что у вас мало методов отладки (например.использование точек останова и трассировки)

Это было полезно?

Решение

Прежде всего, возможно, ошибка вызвана не инструкцией.Обязательно посмотрите, могла ли это вызвать предыдущая или следующая инструкция.Однако если предположить, что обработчики исключений и отладчики улучшились:

Исключение выравнивания это то, что происходит, когда, скажем, 32-битные (4-байтовые) данные извлекаются по адресу, который не кратен 4 байтам.Например, переменная x имеет размер 32 бита по адресу 2, тогда

const1:   dc.w   someconstant
x:        dc.l   someotherconstant

Тогда инструкция

          mov.l x, %r0

приведет к ошибке выравнивания данных на 68000 (и 68010, IIRC).Модель 68020 устранила это ограничение и обеспечивает невыровненный доступ, но за счет снижения производительности.Я не знаю о jsr (переход к подпрограмме) инструкция, требующая выравнивания, но это вполне разумно и ее легко организовать — перед каждой функцией вставьте макрос языка ассемблера для выравнивания:

      .align long
func:   ...

Другие советы

Я давно не пользовался процессором семейства 68K, но могу дать вам несколько советов.Попытка выполнить на невыровненной границе означает выполнение кода по нечетному адресу.Например, если out_string находился по адресу с установленным младшим битом.

То же самое справедливо и для доступа к памяти размером 2 или 4 байта.Я не уверен, поддерживает ли Coldfire доступ к нечетным адресам памяти, но другие члены семейства 68K это сделали.

Ошибка адреса возникает в инструкции, которая вызывает ошибку во всех случаях.

Узнайте, какая там инструкция.Если компьютер соответствует (или близок), то это невыровненное исполнение.Если это доступ к памяти, например.move.w d0,(a0), затем проверьте, какой адрес читается/записывается, в данном случае тот, на который указывает a0.

Я просто хотел добавить, что это очень хорошая вещь, которую стоит выяснить.В своей повседневной работе я программирую высококлассные устройства медицинской визуализации, но иногда мне нужно опуститься до этого уровня.Я нашел и исправил более одной проблемы COTS OS, поскольку смог отследить только такого рода проблемы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top