Команда LDR pc,[pc,#-0xFF0] работает, НО только из Flash... Команда LDR pc,[pc,#-0xFF0] работает, НО только из Flash…
LDR pc,[pc,#-0xFF0]
Или, что то же самое,
LDR pc,[pc,#-(0x18 + 0x8 - 0xFFFFF030)]
Когда выполняется команда по адресу 0x18 в PC находиться значение 0x18 + 0x8 = 0x20 ВСЕГДА, т.е. адрес не следующей команды +0x04, а через одну +0x08 (для обеспечения "конвейерной обработки - pipeline"). И, если от текущего значения PC(0x20) отнять 0xFF0, произойдёт "переполнение в обратную сторону" 32-ух разрядного регистра и результат будет равен 0xFFFFF030. Т.е. адрес, из которого будет загружен регистр назначения (в данном случае PC) станет равен 0xFFFFF030, а это адрес регистра VICVectrAddr. Т.е. PC будет загружен содержимым из регистра VICVectrAddr.
Это всё справедливо, если программа работает из Flash памяти, т.е. начиная с адреса 0x00000000.
Если программа работает из RAM (отладка через Wiggler), т.е. начиная с адреса 0x40000000, то команда LDR pc,[pc,#-0xFF0] грузит в PC содержимое по адресу 0x3FFFF030. А для аналогичного перехода, надо из содержимого PC (0x40000020) вычесть 0x40000FF0, но синтаксис команды LDR допускает только 12-битное смещение.