Программирование на Ассемблере
известно заранее
2. неизвестно Если считать количество цифр фиксированным, то программу написать проще,
однако здесь есть один недостаток: некоторые числа придется дополнять слева
нулями (например, число 1 нужно будет вводить как \"0001\"). Это нас вряд-ли
устроит, поэтому будем исходить из второй альтернативы.
Сначала напишем программу для перевода одного символа. Пусть адрес символа
находится в A0, а результат требуется получить в D0. Имеем: start:
move.l #string,A0 ;адрес символа
bsr.s nibblein ;получить значение
illegal ;место для контрольной точки nibblein: ;получить число по (A0)
moveq #0,D0 ;очищаем D0 (т.к следующая команда
;изменяет только младший байт)
move.b (A0)+,D0 ;извлекаем код цифры
sub #\'A\',D0 ;вычитаем $41
bcc.s ischar ;ветвление, если была буква (A-F)
addq #7,D0 ;иначе была цифра (0-9) - корректируем
ischar:
add #$A,D0 ;корректируем окончательно (ADDQ
;использовать нельзя: $A > 8)
rts string: dc.b \'B\',0 ;исходный символ (\'B\', код $42) end Рассмотрим, как работает эта программа. Первая команда устанавливает
регистр A0 на адрес символа \'B\', после чего вызывается подпрограмма-
конвертор (nibblein).
Внутри конвертора в D0 записывается ASCII-код цифры (в нашем случае $42),
из которого затем вычитается число $41. В результате D0 будет содержать 1
и ветвление сработает, а после прибавления $A получим окончательный
результат - число $B.
А если бы буфер содержал цифру (0-9)? Тогда результат первого вычитания был
бы отрицательным и ветвление не выполнилось бы. Возьмем, например, цифру 5:
ASCII-код символа \'5\' - это $35. После вычитания $41 имеем -12 и флаг C
установлен.
|