Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
Омерики не открою и у Голландии выиграть с таким кодом не получится.
Просто пример. Оверкод большой за счет RET, но в принципе терпимый. ВременнЫе накладные расходы тоже. Примерно так делал когда прищемило размером памяти на 4051, но с помощью jmp @a+DPTR.
// Таблитца различающихся кодов. Для простоты приму что разница в каждом случае только в реализации одной команды.
TABLE_FOR_DIFFERENT0:
dw COP(mov r0,r1), COP( ret ) // case 0
dw COP(mov r1,r0), COP( ret ) // case 1 Addr = (case0 + 4)
dw COP(mov r0,r2), COP( ret ) // case 2 Addr = (case0 + 8)
.....
dw COP(mov r1,r2), COP( ret ) // case 15 Addr = (case0 + 64)
TABLE_FOR_DIFFERENT1:
dw COP(mov r3,r8), COP( ret ) // case 0
dw COP(mov r4,r9), COP( ret ) // case 1. Addr=(case0 + 4)
dw COP(mov r5,r10), COP( ret ) // case 2 Addr = (case0 + 8)
......
dw COP(mov r6,r11), COP( ret ) ///case 15 Addr = (case0 + 64)
TABLE_FOR_DIFFERENT3 онологично
TABLE_FOR_DIFFERENT4 онологично
Программа:
// Пока идет общий код для всех фрагментов
nop
nop
nop
; пришло время выполнить ПЕРВЫЕ различающиеся коды 1 из 16
в r16 - дешифрированный номер текущей ветки "1 из 16"
r16 <<= 2; учет длины различающихся фрагментов кода. Не портить.
Z = TABLE_FOR_DIFFERENT0
Z += r16; настроен на свой фрагмент.
icall
; опять одинаковый код
nop
nop
nop
; пришло время выполнить ВТОРЫЕ различающиеся коды 1 из 16
Z = TABLE_FOR_DIFFERENT1
Z += r16; // в r16 - разница адресов
icall
и так для различающихся мест 2, 3, 4...
Составить ответ | Вернуться на конференцию
Ответы