Как уменьшить кодовое пространство для преобразования шестнадцатеричных символов ASCII, используя _small_ кодовое пространство?
Как уменьшить кодовое пространство для преобразования шестнадцатеричных символов ASCII, используянебольшое кодовое пространство?
Во встроенном приложении у меня необычайно ограниченное пространство (примечание 1). Мне нужно преобразовать байты из последовательного ввода-вывода со значениями ASCII '0' до 9 и "А" в 'F' к обычным шестнадцатеричным значениям от 0 до 15. Кроме того, все остальные 240 комбинаций, включая «а» в 'F', должны быть обнаружены (как ошибка).
Функции библиотеки, такие какscanf(), atoi(), strtol()
являютсядалеко слишком большой, чтобы использовать.
Скорость не проблема. Размер кода является ограничивающим фактором.
Мой настоящий метод повторно отображает 256-байтовые коды в 256 кодов, так что '0' до 9 и "А" в 'Z' имеют значения 0 - 35.Любые идеи о том, как уменьшить или разные подходы приветствуются.
unsigned char ch = GetData(); // Fetch 1 byte of incoming data;
if (!(--ch & 64)) { // decrement, then if in the '0' to '9' area ...
ch = (ch + 7) & (~64); // move 0-9 next to A-Z codes
}
ch -= 54; // -= 'A' - 10 - 1
if (ch > 15) {
; // handle error
}
Примечание 1: существует 256 инструкций для кода и постоянных данных (1 байт данных стоит 1 инструкция) в защищенной памяти PIC для загрузчика. Этот код стоит ~ 10 инструкций. Текущий AP нуждается в переписывании & только с 1 запасной инструкцией,сокращение даже на 1 инструкцию ценно. Я'Я прохожу это по частям. И посмотрели на общую реконструкцию.
Примечания: PIC16. Я предпочитаю кодировать в 'C', но должен делать то, что нужно. Код сборки следующий. Быстрый ответ не требуется.
if (!(--ch & 64)) {
002D:DECF 44,F 002E:BTFSC 44.6 002F:GOTO 034
ch = (ch + 7) & (~64);
0030:MOVLW 07 0031:ADDWF 44,W 0032:ANDLW BF 0033:MOVWF 44
}// endif
ch -= 54;
0034:MOVLW 36 0035:SUBWF 44,F
[редактироватьлучшее решение]
Оптимизация существующего решения в соответствии с предложением @GJ. В С, выполняяch += 7; ch &= (~64);
вместоch = (ch + 7) & (~64);
сохранено 1 инструкция. Переход на сборку спас другой, не перегружаяch
в пределах.if()