Программа на ассемблере для процессора КР580МП80.




Содержание

Постановка задачи. 3

Разработка алгоритма. 4

Блок-схема программы.. 5

Программа на ассемблере для процессора МП КР 580 МП 80. 8

Вывод. 11

Литература. 11


Алгоритм решения поставленной задачи.

В адресном пространстве 0800h-0900h записана последовательность 7 битных чисел. Причем в целях экономии объёма ОЗУ биты записываются один за другим. Найти и записать максимальное число и его порядковый номер

Формат чисел:

1 ячейка памяти

Мл.бит Ст.бит           Мл.бит
модуль2числа Модуль 1 числа

 

2 ячейка памяти

  Мл.бит Ст.бит          
Модуль 3 числа Модуль 2 числа

 

3 ячейка памяти

    Мл.бит Ст.бит        
Модуль 4 числа Модуль3 числа

 

Для нахождения будем последовательно сравнивать два числа последовательности и сохранять максимальное число в регистре В, а его порядковый номер в регистре D. После проверки всех чисел выведем максимальное число в ячейку 0905h, а порядковый номер – в ячейку 0904h.

В данной программе будем последовательно сравнивать два числа последовательности, и находить максимальное из них. Используя встроенную функцию сдвига содержимого аккумулятора, получим модули чисел. Для получения второго числа последовательности будем сдвигать влево первое число один раз, для получения третьего числа будем сдвигать второе влево два раза и так до восьмой ячейки памяти включительно. После восьмой ячейки последовательности число необходимых сдвигов становится снова один, и все повторяется.

Так как сдвиг числа можно осуществить только загрузив число в аккумулятор, после каждого сдвига текущей ячейки будем сохранять число в ячейки памяти с адресом 0906h, а число идущее непосредственно за текущим в ячейку памяти с адресом 0907h. Если надо будет сделать больше одного сдвига, то можно будет загрузить числа из ячеек памяти. В начале программы за максимальное число принимается первое число последовательности. Порядковый номер числа хранится в регистре D, при появлении нового максимального числа содержимое регистра D записывается в ячейку памяти с адресом 0904h. Если в последовательности есть два равных максимальных числа, то будет сохранён порядковый номер последнего из максимальных чисел.

 

 

Блок-схема программы


В начале программы загружаем в регистровую пару HL адрес первой ячейки последовательности, затем загружаем содержимое второй ячейки последовательности в ячейку памяти с адресом 0907h, а содержимое первой ячейки последовательности в ячейку памяти с адресом 0906h, используя маскирование выделяем модуль первого числа последовательности и сохраняем его в регистре В, в регистры Е и D загружаем числа 01h (блок 1). Регистр D будем использовать для определения порядкового номера максимального числа в последовательности. Регистр Е нужен для того, чтобы после проверки первых 8 ячеек последовательности программа начинала выделять модули чисел по первоначальному алгоритму. Записываем в регистр С (счетчик прохождения цикла) число 01h (блок 2).

В теле цикла сначала загружаем число из ячейки памяти с адресом 0906h в аккумулятор и сдвигаем содержимое аккумулятора влево с переносом (в признак переноса С записывается седьмой бит), сохраняем содержимое аккумулятора в ячейке памяти с адресом 0906h; загружаем число из ячейки памяти с адресом 0907h в аккумулятор и сдвигаем содержимое аккумулятора влево с переносом (на место первого бита записывается бит признака переноса С), сохраняем содержимое аккумулятора в ячейке памяти с адресом 0907h, декрементируем содержимое регистра С (блок 3). Если счетчик цикла не устанавливается в 0, то переходим к блоку 2, иначе – к блоку 4: инкрементируем содержимое регистра D.

Затем проверяем число в аккумуляторе больше предыдущего максимального числа, если да, то переходим к блоку 5: сохраняем число, находящиеся в аккумуляторе, в регистре В, загружаем в ячейку памяти 0904h порядковый номер максимального числа (содержимое регистра D). Переходим к блоку 6: загружаем следующую ячейку последовательности в ячейку памяти с адресом 0906h, а в аккумулятор младший байт адреса ячейки следующей непосредственно за последней ячейкой последовательности чисел, так как мы сначала загружаем адрес следующей ячейки последовательности чисел.

Затем проверяем не последняя ли текущая ячейка, если да, то загружаем из регистра В максимальное число последовательности в ячейку памяти с адресом 0905h (блок 7). Иначе переходим к блоку 8: загружаем в ячейку памяти с адресом 0907h ячейку последовательности, идущей непосредственно за текущей, инкрементируем содержимое регистра Е. Проверяем равно ли содержимое регистра Е 08, если да, то переходим к блоку 2; иначе – к блоку 9: загружаем в регистр С (счетчик прохождения цикла) содержимое регистра Е.


 

Программа на ассемблере для процессора КР580МП80.

 

Метка Адрес Данные Ассемблер Мнемоника Комментарий
    2A   LHLD 0900 (L)←M(0900) (H)←M(0901) Загружаем адрес ячейки памяти, в которой начинается последовательность
      INX H (HL)←(HL)+1 Инкрементируем содержимое регистровой пары HL
      7E   MOV A,M   (A)←M(HL) Загружаем в аккумулятор содержимое ячейки памяти, адрес которой находится в регистровой паре HL
        STA 0907   M(0907)←(A) Загружаем содержимое аккумулятора в ячейку памяти с адресом 0907h
    2B DCX H (HL)←(HL)-1 Декрементируем содержимое регистровой пары HL
      7E   MOV A,M   (A)←M(HL) Загружаем в аккумулятор содержимое ячейки памяти, адрес которой находится в регистровой паре HL
  091A 091B 091C     STA 0906   M(0906)←(A) Загружаем содержимое аккумулятора в ячейку памяти с адресом 0906h
  091D 091E E6 7F ANI 7F (A)←(A)^7F Логически умножаем содержимое аккумулятора на число 7Fh
  091F   MOV B,A (B)←(A) Загружаем содержимое аккумулятора В регистр В
    1E MVI E,01 (E)←01 Загружаем в регистр Е число 01h
      MOV D,E (D)←(E) Загружаем содержимое регистра Е в регистр D
M3   0E MVI C,01 (C)←01 Загружаем в регистр С число 01h
M1   3A   LDA 0906   (A)←M(0906) Загружаем в аккумулятор содержимое ячейки памяти с адресом 0906h
      RAL   Сдвигаем содержимое аккумулятора влево с переносом
  092A 092B     STA 0906   M(0906)←(A) Загружаем содержимое аккумулятора в ячейку памяти с адресом 0906h
  092C 092D 092E 3A   LDA 0907   (A)←M(0907) Загружаем в аккумулятор содержимое ячейки памяти с адресом 0907h
  092F   RAL   Сдвигаем содержимое аккумулятора влево с переносом
        STA 0907   M(0907)←(A) Загружаем содержимое аккумулятора в ячейку памяти с адресом 0907h
 
Метка Адрес Данные Ассемблер Мнемоника Комментарий
    E6 7F ANI 7F (A)←(A)^7F Логически умножаем содержимое аккумулятора на число 7Fh
    0D DCR C (C)←(C)-1 Декрементируем содержимое регистра С
    C2   JNZ M1   JMP if Z=1 Переход на метку М1, если содержимое регистра С не равно 0
      INR D (D)←(D)+1 Инкрементируем содержимое регистра D
  093A B8 CMP B If (A)=(B) then Z=1, C=0 Сравниваем содержимое аккумулятора с содержимым регистра В
  093B 093C 093D DA   JC M2   JMP if C=1 Переход на метку М2, если содержимое аккумулятора не равно содержимому регистра В
  093E   MOV B,A (B)←(A) Загрузка в регистр В содержимого аккумулятора
  093F 7A MOV A,D (A)←(D) Загрузка в аккумулятор содержимого регистра D
        STA 0904   M(0904)←(A) Загружаем содержимое аккумулятора в ячейку памяти с адресом 0904h
M2     INX H (HL)←(HL)+1 Инкрементируем содержимое регистровой пары HL
      7E   MOV A,M   (A)←M(HL) Загружаем в аккумулятор содержимое ячейки памяти, адрес которой находится в регистровой паре HL
        STA 0906   M(0906)←(A) Загружаем содержимое аккумулятора в ячейку памяти с адресом 0906h
  094A 3A   LDA 0902   (A)←M(0902) Загружаем в аккумулятор содержимое ячейки памяти с адресом 0906h
  094B 3C INR A (A)←(A)+1 Инкрементируем содержимое аккумулятора
  094C BD CMP L If (A)=(L) then Z=1, C=0 Сравниваем содержимое аккумулятора с содержимым регистра L
  094D 094E 094F CA   JZ M3   JMP if Z=1 Переход на метку М3, если текущая ячейка не последняя
      INX H (HL)←(HL)+1 Инкрементируем содержимое регистровой пары HL
      7E   MOV A,M   (A)←M(HL) Загружаем в аккумулятор содержимое ячейки памяти, адрес которой находится в регистровой паре HL
        STA 0907   M(0907)←(A) Загружаем содержимое аккумулятора в ячейку памяти с адресом 0907h
Метка Адрес Данные Ассемблер Мнемоника Комментарий
    2B DCX H (HL)←(HL)-1 Декрементируем содержимое регистровой пары HL
    1C INR E (E)←(E)+1 Инкрементируем содержимое регистра Е
    7B MOV A,E (A)←(E) Загрузка в аккумулятор содержимого регистра Е
    D6 SUI 08 (A)←(A)-08 Вычитаем из содержимого аккумулятора число 08h
  095A 095B 095C CA   JZ M4   JMP if Z=1 Переход на метку М4, если содержимое аккумулятора меньше числа 08h
  095D 4B MOV C,E (C)←(E) Загрузка в регистр С содержимого регистра Е
  095E 095F C3   JMP M1   Переход на метку М1
M3     MOV A,B (A)←(B) Загрузка в аккумулятор содержимого регистра В
        STA 0905   M(0905)←(A) Загружаем содержимое аккумулятора в ячейку памяти с адресом 0905h
    FF RST 7   Конец программы

 


 

Вывод.

В ходе выполнения курсовой работы, была написана тест-программа ОЗУ для процессора КР580ВМ80, позволяющая найти максимальное семибитное число в последовательности ячеек памяти и определить порядковый номер в последовательности максимального числа. Для адресов первой и последней ячейки последовательности используем ячейки памяти с адресами 0900h-0902h, так как из условия следует, что старший байт адреса ячеек не изменяется. Задание адресов ячеек начала и конца последовательности позволяет нам ограничить поиск максимального числа в нужных нам границах адресного пространства.

Для хранения порядкового номера максимального числа мы использовали регистр D, в который может вместиться максимальное число FF, а так как последовательность может находится только в ячейках памяти ограниченных адресами 0800h и 08FFh, одного регистра D будет достаточно для нашей задачи. Из-за того, что числа располагаются в разных битах ячеек памяти программа получилась больше, чем хотелось бы. Данный алгоритм можно использовать для чисел с меньшим количеством бит, но при этом нужно учитывать, что для номера максимального числа может потребоваться два байта, а это немного усложнит программу.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-01-30 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: