Консультация # 189597: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Программа CompModel Жмакина Задание: Вывод на дисплей содержимого группы ячеек памяти в числовой форме (адрес и длина группы — параметры подпрограммы) Используемые ВУ: Дисплей, таймер Пояснение: Содержимое ячейки распаковывается (с учетом знака), каждая цифра преобразуется в соотве...
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Программа CompModel Жмакина Задание: Вывод на дисплей содержимого группы ячеек памяти в числовой форме (адрес и длина группы — параметры подпрограммы) Используемые ВУ: Дисплей, таймер Пояснение: Содержимое ячейки распаковывается (с учетом знака), каждая цифра преобразуется в соответствующий ASCII-код и выдается на дисплей. При переходе к выводу содержимого очередной ячейки формируется задержка 10 с
;зададим параметры программы
RD #92 ;адрес начала массива чисел
WR 90 ;ячейка памяти с адресом начала массива чисел
RD #4 ;количество чисел
WR 91 ;ячейка памяти с количеством
RDI #100123 ;-123
WR 92
RD #125 ;125
WR 93
RD #0 ;0
WR 94
RDI #100010 ;-10
WR 95
;начало самой программы
RD #101 ;команда очистки дисплея
OUT 11 ;в регистр CR
RD #11 ;разрешаем дисплей с автоинкрементом адреса
OUT 11 ;в регистр CR
RD 90 ;адрес массива чисел в регистр R1
WR R1
RD 91 ;количество в R2
WR R2
;основной цикл
M0:RD #250 ;зададим счетчик таймера 1 на порядка 10 сек
OUT 21 ;в регистр Т1
RDI 1101 ;k=01, автодекремент счета, без прерывания, включение таймера 1
OUT 22 ; в регистр CT1R
;ждем, когда таймер отсчитает время
M1:IN 20 ;ждем флаг в регистре SR
JZ M1
;останавливаем таймер
RDI 1000 ;выключаем таймер 1
OUT 22
RD #101 ;сбрасываем флаг отсчета времени в SR
OUT 20
CALL M ;считываем и выводим очередное число
RDI 32 ;отделим пробелом
OUT 10
JRNZ R2,M0 ;по всем числам массива
HLT ;останов
;считывание и вывод знакового числа
M:RDI 0
WR R5 ;счетчик цифр = 0
RD @R1+ ;очередное число, с автоинкрементом адреса
WR R3 ;сохраним в R3
JNS LOOP ;число положительное?
;для отрицательного выведем минус
RDI 45 ;'-'
OUT 10
RD R3 ;исходное число
MULI 100001 ;меняем знак на +, умножением на -1
WR R3 ;и сохраним в R3
LOOP: ;вывод положительного числа
;сначала сформируем последовательность цифр числа
;сохраним их в стеке, т.к. они будут использованы в обратном порядке
DIVI 10 ;делим на основание с.с. = 10
WR R4 ;сохраним частное в R4
MULI 10 ;опять умножим на 10, т.о. обнулили младший разряд
SUB R3 ;отняв исходное число, получим очередной разряд, но со знаком -
MULI 100001 ;сделаем его положительным
WR R6 ;сохраним в R6 для PUSH-а
PUSH R6 ;в стек!
RD R5 ;и считаем разряды
ADI 1
WR R5
RD R4 ;частное от деления на 10
JZ PRINT ;=0? если да, то разряды кончились
WR R3 ;иначе сохраним в R3
JMP LOOP ; и на повтор
PRINT: ;осталось вывести на дисплей
POP R6 ;получаем очередную цифру
RD R6 ;в аккумулятор
ADI 48 ;делаем из нее символ
OUT 10 ;и на экран
RD R5 ;уменьшаем счетчик цифр
SBI 1
JZ RETURN ;цифры кончились?
WR R5 ;нет - продолжаем
JMP PRINT
RETURN:
RET
Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 21.06.2016, 20:56
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались.
Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора -
для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение.
Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал,
который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом.
Заходите - у нас интересно!