Программирование на Ассемблере
Поэтому к D0 прибавится число 7, а затем и $A (10). В
результате получим 5.
У этой подпрограммы есть один недостаток, а именно - отсутствие контроля за
правильностью входных данных: если в буфер записать любой символ, не
являющийся шестнадцатеричной \"цифрой\", то в D0 может оказаться все, что
угодно. Однако здесь мы для краткости опустим проверку на допустимые
значения, при необходимости Вы можете добавить ее сами. Переходим к написанию конвертора многосимвольных шестнадцатеричных чисел.
Для начала заметим, что самая первая цифра представляет старший полубайт
числа. Чтобы учесть это, а также то, что нам неизвестно количество символов
во входной строке (на самом деле будем предполагать, что результат
поместится в 32-битное слово), используем небольшой трюк.
Сначала приведем текст программы (перед вызовом подпрограммы-конвертора A0
должен содержать адрес входной строки; результат возвращается в D1): hexin: ;тестовая программа
moveq #0,D1 ;для начала обнуляем D1
lea string(PC),A0 ;адрес строки - в A0 (lea через PC -
;эффективнее и короче, чем move.l)
bsr.s hexinloop ;вызов подпрограммы-конвертора
illegal ;для отладки hexinloop:
tst.b (A0) ;конец строки? (нулевой байт)
beq.s hexinok ;да, выход
bsr.s nibblein ;иначе продолжаем: вызов конвертора
;текущей цифры
lsl.l #4,D1 ;сдвигаем результат
or.b D0,D1 ;\"вставляем\" полубайт
bra.s hexinloop ;цикл
hexinok:
rts ;возврат nibblein: ;конвертор ASCII-цифры в полубайт
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 Протестируйте эту программу с помощью отладчика, наблюдая за содержимым
регистра D1.
|