; *****************
; * ФУНКЦИЯ: Умножает 1-байтное число на 10 *
; * ПРИМЕР: h’64 х 0А = ЗЕ8’ (d’100 х 10 = 1000’) *
; * ВХОД: Множимое помещается в стек по адресу PSP *
; * ВЫХОД: Произведение по адресу PSP-3:PSP-2 в формате (старший байт:младший байт) *
; *****************
Х10 movf PSP,w; Устанавливаем FSR на
movwf FSR; текущую позицию стека
decf FSR,f; Указываем на байт расширения XCAND
clrf INDF; Обнуляем его
;Теперь умножим на 2, сдвинув XCAND на один бит влево
bcf STATUS,С; Сбрасываем бит переноса
incf FSR,f;Указываем на младший байт XCAND
rlf INDF,f;Сдвигаем влево младший байт
decf FSR,f;Указываем на старший байт
rlf INDF,f;Сдвигаем влево старший байт
; Прибавляем к 16-битному частичному произведению
incf FSR,f; Указываем на младший байт XCANDx2
movf INDF,w; Считываем его
decf FSR,f; Указываем на младший байт произведения
decf FSR,f
movwf INDF; Копируем туда младший байт XCANDx2
incf FSR,f; Указываем на старший байт XCANDx2
movf INDF,w; Считываем его
decf FSR,f; Указываем на старший байт произведения
decf FSR,f
movwf INDF; Копируем туда старший байт XCANDx2
; Теперь надо сдвинуть еще на два бита, чтобы умножить на 8
incf FSR,f; Указываем на младший байт XCANDx2
incf FSR,f
incf FSR,f
bcf STATUS,С; Сбрасываем бит переноса
rlf INDF,f; Сдвигаем влево младший байт
decf FSR, f ; Указываем на старший байт XCANDx2
rlf INDF,f; Сдвигаем влево старший байт
incf FSR,f
rlf INDF,f; Сдвигаем влево младший байт
decf FSR,f; Указываем на старший байт
rlf INDF,f; Сдвигаем влево старший байт
; Прибавляем к 16-битному частичному произведению
incf FSR,f; Указываем на младший байт XCANDx8
movf INDF,w; Считываем его
decf FSR,f; Указываем на младший байт произведения
decf FSR,f
addwf INDF,f; Прибавляем младший байт
incf FSR,f; Указываем на старший байт XCANDx8
btfsc STATUS,С; ЕСЛИ перенос, ТО инкрементируем старший байт
incf INDF,f
movf INDF,w; ИНАЧЕ просто считываем его
decf FSR,f; Указываем на старший байт произведения
decf FSR,f
addwf INDF,f; Прибавляем старший байт
return
Для гарантии того, что в подпрограмме дешифратора 7-сегментного кода (Программа 6.6) не возникнет переполнения регистра PCL при прибавлении к нему смещения, программист воспользовался директивой org (ORiGin; см. стр. 244), которая указывает ассемблеру разместить подпрограмму по некоторому абсолютному адресу (h’700’ в Программе 6.14). При тестировании подпрограммы посредством вызова ее из другой части программы по адресу, меньшему h’700’, система «падает» и ее поведение становится непредсказуемым. Что было сделано неправильно?
Решение