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

Министерство образования и науки Российской Федерации.

Федеральное агентство по образованию.

Государственное образовательное учреждение высшего профессионального образования.

Магнитогорский государственный технический университет им. Носова Г. И.

Кафедра Электроники и Микроэлектроники.

Курсовая работа по дисциплине:

«Машинные языки программирования»

Вариант №41.

Выполнила студентка группы АП-09

Никитина Н. В.

 

 

Проверил к.т.н., доцент кафедры

Э и Мэ Швидченко Д.В.

 

 

 

Магнитогорск 2011

Содержание

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

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

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

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

Вывод. 11

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


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

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

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

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

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

Модуль 1 числа

 

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

7 Мл.бит Ст.бит 4 3 2 1 0

Модуль 3 числа

Модуль 2 числа

 

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

7 6 Мл.бит Ст.бит 3 2 1 0

Модуль 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.

 

Метка Адрес Данные Ассемблер Мнемоника Комментарий
  0910 0911 0912 2A 00 09   LHLD 0900 (L)←M(0900) (H)←M(0901) Загружаем адрес ячейки памяти, в которой начинается последовательность
  0913 23 INX H (HL)←(HL)+1 Инкрементируем содержимое регистровой пары HL
    0914   7E   MOV A,M   (A)←M(HL) Загружаем в аккумулятор содержимое ячейки памяти, адрес которой находится в регистровой паре HL
  0915 0916 0917 32 07 09   STA 0907   M(0907)←(A) Загружаем содержимое аккумулятора в ячейку памяти с адресом 0907h
  0918 2B DCX H (HL)←(HL)-1 Декрементируем содержимое регистровой пары HL
    0919   7E   MOV A,M   (A)←M(HL) Загружаем в аккумулятор содержимое ячейки памяти, адрес которой находится в регистровой паре HL
  091A 091B 091C 32 06 09   STA 0906   M(0906)←(A) Загружаем содержимое аккумулятора в ячейку памяти с адресом 0906h
  091D 091E E6 7F ANI 7F (A)←(A)^7F Логически умножаем содержимое аккумулятора на число 7Fh
  091F 47 MOV B,A (B)←(A) Загружаем содержимое аккумулятора В регистр В
  0920 0921 1E 01 MVI E,01 (E)←01 Загружаем в регистр Е число 01h
  0922 53 MOV D,E (D)←(E) Загружаем содержимое регистра Е в регистр D
M3 0923 0924 0E 01 MVI C,01 (C)←01 Загружаем в регистр С число 01h
M1 0925 0926 0927 3A 06 09   LDA 0906   (A)←M(0906) Загружаем в аккумулятор содержимое ячейки памяти с адресом 0906h
  0928 17 RAL   Сдвигаем содержимое аккумулятора влево с переносом
  0929 092A 092B 32 06 09   STA 0906   M(0906)←(A) Загружаем содержимое аккумулятора в ячейку памяти с адресом 0906h
  092C 092D 092E 3A 07 09   LDA 0907   (A)←M(0907) Загружаем в аккумулятор содержимое ячейки памяти с адресом 0907h
  092F 17 RAL   Сдвигаем содержимое аккумулятора влево с переносом
  0930 0931 0932 32 07 09   STA 0907   M(0907)←(A) Загружаем содержимое аккумулятора в ячейку памяти с адресом 0907h

 

Метка Адрес Данные Ассемблер Мнемоника Комментарий
  0933 0934 E6 7F ANI 7F (A)←(A)^7F Логически умножаем содержимое аккумулятора на число 7Fh
  0935 0D DCR C (C)←(C)-1 Декрементируем содержимое регистра С
  0936 0937 0938 C2 25 09   JNZ M1   JMP if Z=1 Переход на метку М1, если содержимое регистра С не равно 0
  0939 14 INR D (D)←(D)+1 Инкрементируем содержимое регистра D
  093A B8 CMP B If (A)=(B) then Z=1, C=0 Сравниваем содержимое аккумулятора с содержимым регистра В
  093B 093C 093D DA 43 09   JC M2   JMP if C=1 Переход на метку М2, если содержимое аккумулятора не равно содержимому регистра В
  093E 47 MOV B,A (B)←(A) Загрузка в регистр В содержимого аккумулятора
  093F 7A MOV A,D (A)←(D) Загрузка в аккумулятор содержимого регистра D
  0940 0941 0942 32 04 09   STA 0904   M(0904)←(A) Загружаем содержимое аккумулятора в ячейку памяти с адресом 0904h
M2 0943 23 INX H (HL)←(HL)+1 Инкрементируем содержимое регистровой пары HL
    0944   7E   MOV A,M   (A)←M(HL) Загружаем в аккумулятор содержимое ячейки памяти, адрес которой находится в регистровой паре HL
  0945 0946 0947 32 06 09   STA 0906   M(0906)←(A) Загружаем содержимое аккумулятора в ячейку памяти с адресом 0906h
  0948 0949 094A 3A 02 09   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 61 09   JZ M3   JMP if Z=1 Переход на метку М3, если текущая ячейка не последняя
  0950 23 INX H (HL)←(HL)+1 Инкрементируем содержимое регистровой пары HL
    0951   7E   MOV A,M   (A)←M(HL) Загружаем в аккумулятор содержимое ячейки памяти, адрес которой находится в регистровой паре HL
  0952 0953 0954 32 07 09   STA 0907   M(0907)←(A) Загружаем содержимое аккумулятора в ячейку памяти с адресом 0907h
Метка Адрес Данные Ассемблер Мнемоника Комментарий
  0955 2B DCX H (HL)←(HL)-1 Декрементируем содержимое регистровой пары HL
  0956 1C INR E (E)←(E)+1 Инкрементируем содержимое регистра Е
  0957 7B MOV A,E (A)←(E) Загрузка в аккумулятор содержимого регистра Е
  0958 0959 D6 08 SUI 08 (A)←(A)-08 Вычитаем из содержимого аккумулятора число 08h
  095A 095B 095C CA 23 09   JZ M4   JMP if Z=1 Переход на метку М4, если содержимое аккумулятора меньше числа 08h
  095D 4B MOV C,E (C)←(E) Загрузка в регистр С содержимого регистра Е
  095E 095F 0960 C3 25 09   JMP M1   Переход на метку М1
M3 0961 78 MOV A,B (A)←(B) Загрузка в аккумулятор содержимого регистра В
  0962 0963 0964 32 05 09   STA 0905   M(0905)←(A) Загружаем содержимое аккумулятора в ячейку памяти с адресом 0905h
  0965 FF RST 7   Конец программы

 


 

Вывод.

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

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

 

 


Дата добавления: 2021-03-18; просмотров: 64; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!