Практические задания на экзамен по дисциплине "Цифровые и микропроцессорные устройства"

Страницы работы

Содержание работы

  1. Из массива размером 128 байт начинающегося с адреса MASS1 выбрать четные значения и записать их в ячейку MASS2. Реализовать в виде ПП и нарисовать схему алгоритма.

(в MASS2 я записывал кол-во четных, а не сами числа)

               call podpr;                         вызываем нашу подпрограмму

               ………….

               ………….

podpr:

                      lxi H,MASS1;                    загружаем указатель чтения в HL

                      mvi B,128;                         загружаем счетчик  повторений в регистр B

                      mvi C,0;                             обнуляем счетчик кол-ва четных чисел

loop:

                      mov A,M;                           читаем текущий элемент массива

                      rrc;                                      младший бит заносим в CY

                      jc skip;                               если CY равен 1, число нечетное, не считаем его

                      inr C;                                  если дошли сюда, то CY =0, число четное, считаем его

skip:

                      inx H;                                 смещаем указатель чтения

                      dcr B;                                  уменьшаем счетчик повторений

                      jnz loop;                             повторяем пока B не равен 0

                      mov A,C;                            заносим С в A (С-счетчик четных чисел)

                      sta MASS2;                        пишем A в MASS2 (т.е. кол-во четных чисел)

                      ret                                        возвращаемся из подпрограммы

  1. Составить схему алгоритма и написать программу которая вычисляет сумму всех байтов буфера buf5, размером 8000байт. Формат суммы- 32 разряда, buf5-символическое имя.

lxi H,0;                               обнуляем счетчик наших чисел (используем регистровую пару, т.к счетчик 32 разрядный)

lxi D,buf5;                         загружаем указатель чтения в DE

lxi B,0;                               обнуляем счетчик цикла(в этот раз будем не вычитать, а идти от 0 до 8000)

loop:

                              ldax D;                 загружаем текущий элемент из буфера в A

                              add L;                                 складываем A с младшим словом регистра HL

                              mov L,A;                            и заносим эту сумму в L

                              jnc skip;                             если при суммировании был перенос,

                              inr H;                                  увеличим старшее слово на 1

skip:

                              inx D;                                 смещаем указатель чтения

                              inx B;                                  увеличиваем счетчик цикла

                              mov A,B                             проверим старшее слово счетчика В

cpi 80;                                если оно равно 80, мы набрали 8000 повторений, выходим,

                              jnz loop;                             если нет продолжаем    

  1. Написать ПП, которая из массива, расположенного между адресами ADR24 и ADR25 (ADR24<ADR25) выбирает байты, попадающие внутрь допуска, заданного  LMIN и LMAX, и записывает их в массив, определенный начальным адресом ADR26 (ADR26>ADR25). Адреса ADR24, ADR25, ADR26 передать в ПП как параметры через регистры( HL, DE, BC соответственно), LMIN, LMAX-символические константы.

Предполагаем, что ADR25-ADR24<FF00h

Решение:

lxi  H, ADR24;   помещаем ADR24 в HL

lxi  D, ADR25;   помещаем ADR25 в DE

lxi  B, ADR26;    помещаем ADR26 в BC

call  podpr;                        вызываем подпрограмму

podpr:

                              mov A,E;                            вычислим кол-во ячеек между адресами ADR25 и

                              sub L;                                 ADR24, для этого вычтем из DE HL, проделываем:

                              mov E,A;                            E->A, A=A-L,A->E; для старшего слова:

                              mov A,D;                           D->A, A=A-H-CY,A->D;

                              sbb H;

                              mov D,A;

                              dcx D;                                 вычтем 1, т.к. Окончание цикла произойдет при                                                                                                         DE=FFFFh, а не при 0000h

loop:

                              mov A,M;                           читаем текущий элемент

                              cpi LMIN;                          сравниваем с минимальной границей

                              jc skip;                               если есть флаг CY, то текущий байт < LMIN

                              cpi LMAX;                        сравниваем с максимальной границей

                              jnc skip;                             если флаг CY=0, то текущий байт >LMAX

                              stax B;                                сюда доходим, если байт удовлетворяет нашим                                             inx B;                                  требованиям, записываем его в новый массив

Похожие материалы

Информация о работе