Программирование на Ассемблере
4: ;подпрограмма-конвертор
divu #1000,D1 ;делим на 1000
bsr.s digit ;обработка результата и пересылка
;остатка
divu #10,D1 ;делим на 10
bsr.s digit ;обработка результата и пересылка
;остатка
;обработка остатка: digit: add #$30,D1 ;переводим результат в ASCII
move.b D1,(A0)+ ;записываем в цифру в буфер
clr D1 ;очищаем младшее слово (moveq #0
;использовать нельзя, так как в этом
;случае обнулится весь регистр)
swap D1 ;остаток - в младшее слово
rts ;возврат buffer: blk.b 5,0 ;место для записи результата end Здесь мы использовали небольшой трюк, который является типичным для
ассемблерного программирования: после трехкратного вызова digit мы попадаем
прямо в эту подпрограмму, не используя при этом команды BSR или JSR. Как
только управление доходит до команды rts, происходит возврат в программу
main, а не в deci_4. Таким образом мы имеем неявный четвертый вызов
подпрограммы digit и возврат в главную программу.
Протестируйте эту программу с помощью отладчика для разных начальных
значений (помните, что эта программа корректно работает только с числами из
диапазона 0-9999). Теперь переходим к рассмотрению обратной задачи - задачи преобразования
символьных строк в двоичные числа. 4.3.3. Перевод ASCII-строк в шестнадцатиричные числа. Как мы уже говорили, каждый символ ASCII-записи шестнадцатиричного числа
задает его отдельный полубайт. В п. 4.3.1 мы уже использовали этот факт,
однако теперь нам нужно написать в некотором смысле обратную программу.
У нас есть две альтернативы: количество шестнадцатиричных цифр 1.
|