ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
3 мая
15658 Топик полностью
KAI (15.10.2004 14:42, просмотров: 1) ответил kerk на Ответ: Странно, у меня все работает...
Команда 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-битное смещение.