реклама на сайте
подробности

 
 
> Странная генерация исключения Misaligned (ARM9)
Harvester
сообщение Sep 4 2015, 20:28
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Добрый день.
Процессор ARM926, отладчик - китайский T32.
В процессе портирования кода опять столкнулся с исключением Misaligned. Нашел функцию, ПОСЛЕ возврата из которой возникает упомянутое исключение. Обращаю внимание - именно после возврата. Причем если поставить точку останова на команду, следующую за командой вызова функции, то выполнение программы на ней останавливается как бы без генерации исключения, однако при последующем запуске (RUN или STEP) отладчик пишет "Emulator running", а устройство перезапускается (штатное поведение при фатальной ошибке в рабочем режиме). Т.е. исключение генерируется, но почему-то отладчик его не отслеживает, а, наоборот, "теряет" устройство. То же самое происходит если дойти до этой команды пошагово (при этом неважно, есть там точка останова или нет).
А вот если поставить точку останова на 2-ю команду после команды вызова функции, то до нее программа не доходит, а вылетает в обработчик фатальных ошибок.
Стек в порядке. На всякий случай код функции:
Код
void MainCipherStepWithOptimization (
  PULONG pN,                  // r0 = 01AF4054
  PUCHAR pKey,                // r1 = 01AF408C
  PUCHAR keyIndexes,          // r2 = 00F44E20
  PULONG pSubstTable,         // r3 = 00CA2027
  unsigned char itCounter
)
{
    ULONG Temp, Idx;
    PULONG pKeyItem = (PULONG)pKey;
    int i;

    for (i = 0; i < itCounter; i++)
    {
        Idx = *pN + pKeyItem[keyIndexes[i]];

        Temp = pSubstTable[((Idx >> 0)  & 0x000000FFUL)        ]
             | pSubstTable[((Idx >> 8)  & 0x000000FFUL) + 0x100]
             | pSubstTable[((Idx >> 16) & 0x000000FFUL) + 0x200]
             | pSubstTable[((Idx >> 24) & 0x000000FFUL) + 0x300];

        Temp ^= *(pN + 1);
      
        *(pN + 1) = *pN;
        *pN = Temp;
    }
    Temp = *pN;
    *pN = *(pN + 1);
    *(pN + 1) = Temp;
}

Единственная зацепка - нечетное значение указателя на массив long-ов pSubsTable. Но если дело в этом, то почему не возникает исключения во время работы функции (при обращении к этому массиву)? Больше ничего криминального не вижу.
Подскажите пожалуйста, что может быть причиной такого поведения - уже всю голову сломал.


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01375 секунд с 7
ELECTRONIX ©2004-2016