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

(адрес в BC), смещаем указатель записи

skip:

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

                              dcx D;                                 уменьшаем счетчик цикла

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

                              cpi 0FFh;                            если оно равно FFh, то выходим, если нет повторяем

                              jnz loop;                             (использовали команду cpi, т.к dcx не влияет на флаги)

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

(в 3ей херь была написана, переделал)

Решение:

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;

loop:

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

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

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

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

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

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

(адрес в BC), смещаем указатель записи

skip:

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

                              dcx D;                                 уменьшаем счетчик цикла

                              cpi 0;                                  если счетчик = 0, то выходим, если нет повторяем

                              jnz loop;                             (использовали команду cpi, т.к dcx не влияет на флаги)

  1. Составить схему алгоритма и написать программу, которая вычисляет сумму всех Н-цифр байтов в буфере buf10, размером 60h, байт. Вычисление суммы произвести по модулю 256. Замечание: каждый байт буфера содержит две Н-цифры

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

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

                              mvi D,0;                             обнуляем счетчик нашей суммы

loop:

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

                              mov A,C;                            копируем его в А

                              ani 00001111b;  оставляем только младшую Н цифру

                              add D;                                 складываем с текущей суммой

                              mov D,A;                           оставляем всумму в D  

                              mov A,C;                            снова копируем текущий байт в А