Процессор 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;
}
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. Но если дело в этом, то почему не возникает исключения во время работы функции (при обращении к этому массиву)? Больше ничего криминального не вижу.
Подскажите пожалуйста, что может быть причиной такого поведения - уже всю голову сломал.