Программирование на Ассемблере
А трюк состоит в том, что мы каждый раз сдвигаем результат на 4 бита,
освобождая тем самым место для следующего полубайта. Таким образом, самый
последний полубайт окажется в младшей позиции, и D1 будет содержать
правильный результат.
Чтобы обеспечить контроль входных данных, нам потребуется немного изменить
программу, добавив после вызова nibblein проверку корректности символов. А
именно, если содержимое D0 после возврата из nibblein больше чем $F, то
текущий символ не является цифрой (0-9, A-F) и нужно закончить обработку
строки. Такую проверку можно задать несколькими способами, мы будем
использовать самый простой из них - cmp #$10,D0: если флаг C очищен, то
содержимое D0 больше или равно $10.
Такое изменение программы, кстати, позволит нам опустить проверку конца
строки - ведь нулевой байт также не является ASCII-кодом цифры. Приведем
текст программы с контролем входных данных: ;(4.3.1C) hex-conv2
hexin: ;тестовая программа
moveq #0,D1 ;обнуляем D1
lea string(PC),A0 ;адрес строки - в A0
bsr.s hexinloop ;вызов конвертора
illegal ;для отладки hexinloop:
bsr.s nibblein ;конвертируем текущий символ
cmp #$10,D0 ;проверка на правильность
bcc.s hexinok ;текущий символ - не из диапазона
;0-9,A-F
lsl.l #4,D1 ;сдвигаем результат
or.b D0,D1 ;накладываем следующий полубайт
bra.s hexinloop
hexinok:
rts ;возврат nibblein: moveq #0,D0 ;очищаем D0 от \"мусора\"
move.b (A0)+,D0 ;извлекаем очередную цифру, перемещаем
;указатель
sub #\'A\',D0 ;вычитаем $41
bcc.s ischar ;символ из диапазона \'A\'-\'F\'
addq #7,D0 ;иначе корректируем
ischar:
add #\'A\',D0 ;корректируем окончательно
rts ;все string: dc.b \"56789ABC\",0 ;ASCII-запись исходного числа плюс
;нулевой байт как признак конца строки end Итак, мы рассмотрели алгоритм преобразования шестнадцатиричных ASCII-чисел
в двоичные.
|