Работаю на отладочной плате OLIMEX Header boards. Проц - LPC2138. Кому интересно можно поглядеть тут
http://www.mt-system.ru/p125.mt . Среда Keil. Компилятор RealView.
Есть функция сравнивающая 2 больших массива, где в первых двух байтах длина массивов. По окончании сравнения если равно возвращается 0, если больше 1, если меньше -1. Так вот при возврате "-1" в определенный момент, когда определенное число принимает определенное значение (сравнение производится в цикле), следующий код портит R14.
Код
0001e4 e1d300b0 LDRH r0,[r3,#0]
0001e8 e1d110b0 LDRH r1,[r1,#0]
0001ec e1500001 CMP r0,r1
0001f0 9a000001 BLS |L1.508|
|L1.500|
0001f4 e3a00001 MOV r0,#1
0001f8 e12fff1e BX lr
|L1.508|
0001fc e3e00000 MVN r0,#0
000200 e12fff1e BX lr
До команды CMP r0,r1 содержимое R14 верное, после нее становится неверным.
Содержимое R0 и R1 таково, что переход идет в метку L1.500 и соответственно возвращается функция не туда откуда вызывалась.
Такой глюк возникает только в определенный момент, то не всегда. Гдето 95% глюка, в остальное время этот момент проходит, но скорее всего при следующей итерации в цикле глюк повторяется.
На что грешить и не знаю даже. В функции нет вообще ни одной команды, как либо работающей с R14.
Бьюсь головой в стену уже второй день