Консультация № 189597
20.06.2016, 11:47
0.00 руб.
0 2 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:

Программа CompModel Жмакина
Задание: Вывод на дисплей содержимого группы ячеек памяти в числовой форме (адрес и длина группы — параметры подпрограммы)
Используемые ВУ: Дисплей, таймер
Пояснение: Содержимое ячейки распаковывается (с учетом знака), каждая цифра преобразуется в соответствующий ASCII-код и выдается на дисплей. При переходе к выводу содержимого очередной ячейки формируется задержка 10 с

Обсуждение

давно
Посетитель
7438
7205
21.06.2016, 17:11
общий
Адресаты:
Хотелось бы посмотреть, что Вы сами написали...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
21.06.2016, 20:56
общий
это ответ
Здравствуйте, darkdimon!
[code lang=asm h=200];зададим параметры программы
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
[/code]
5
благодарю
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа