Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой.docx
Скачиваний:
21
Добавлен:
11.02.2015
Размер:
66.37 Кб
Скачать

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

ФГБОУ ВПО «Магнитогорский государственный технический университет» им. Г. И. Носова

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

Курсовая работа

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

Вариант №10

Выполнил: студент группы АП-10-1 Аркузин И.В.

Проверил: д.т.н., профессор кафедры ЭиМЭ Лукьянов С.И.

Магнитогорск, 2013 г.

Оглавление

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

Магнитогорск, 2013 г. 1

1. Задание 3

2. Выполнение работы 3

2.1 Анализ поставленной задачи. 3

2.2 Блок схема алгоритма решения задачи. 4

2.3 Описание программы на языке Ассемблера и в машинных кодах. 9

Вывод 13

Библиографический список 14

1. Задание

Сложить 5 двухбайтных чисел, находящихся в адресном пространстве 0800h-0809h, с учетом знака и переноса из старшего бита суммы. Ответ разместить в ячейках 080Ah - 090Ch. Лишние биты суммы заполнить нулями. Формат чисел:

Младший байт

7

6

5

4

3

2

1

0

Модуль числа

З

Старший байт

7

6

5

4

3

2

1

0

Модуль числа

З – знак числа.

2. Выполнение работы

2.1 Анализ поставленной задачи.

Если все числа будут максимально возможные (FFFFh), то их сумма составит 5*FFFF= 4FFFBh. Поэтому для ответа понадобится три ячейки памяти. Так как числа имеют особый формат (знак числа находится в нулевом бите младшего байта), знак нужно поставить на место седьмого бита старшего байта. Для этого,будем действовать по следующему алгоритму:

  1. В аккумулятор загружается младший байт числа;

  2. Содержимое аккумулятора сдвигается вправо без переноса;

  3. Производится операция логическое “И”;

  4. Заготовленная маска сохраняется в регистр Е;

  5. После второй операции бит переноса Cустановился в значение, нам неизвестное, поэтому установим его в значение “0” (чтобы потом при помощи сдвига вправо с переносом на место седьмого бита старшего байта встал 0);

  6. В аккумулятор загружается старший байт числа;

  7. Содержимое аккумулятора сдвигается вправо с переносом (теперь бит переноса С равен значению нулевого бита старшего байта) и на место седьмого бита встал 0;

  8. Производим операцию логическое “ИЛИ” содержимого аккумулятора с маской, хранящейся в регистре E;

  9. Старший байт готов, перемещаем его в регистр D;

  10. Теперь нужно, чтобы на место седьмого бита младшего байта, встал нулевой бит старшего байта;

  11. Загружаем в аккумулятор младший байт в первоначальном виде;

  12. Содержимое аккумулятора сдвигаем вправо с переносом;

  13. Младший байт готов, перемещаем его в регистр E.

Регистровая пара BCбудет содержать адрес текущей ячейки массива чисел, то есть байта. При сложении чисел, будут складываться содержимое регистровых парHLиDE,HL- будет содержать промежуточный результат сложения, аDE- следующее число. Поэтому перед началом основной программы, регистровую паруHLнужно обнулить.

После загрузки старшего байта в регистр D, сразу же будем проверять число на знак, для этого в аккумулятор загрузим содержимое ячейки памяти с адресомAddr3 (где первоначально будут содержаться нули), если число будет отрицательное. Прибавим к содержимому аккумулятораFFh, перезапишем содержимое аккумулятора в ту же ячейку памятиAddr3. После сложения чисел, будем проверять перенос из старшего бита. Для этого, если будет перенос, в аккумулятор загрузим содержимое ячейки памятиAddr2, где тоже первоначально будут нули, проинкрементируем содержимое аккумулятора, сохраним в ту же ячейку памятиAddr2. Чтобы выйти из цикла сложения, нам понадобится счетчик чисел, для этого в начале программы загрузим в ячейку памятиAddr1 число 5. После проверки на перенос, будем загружать содержимое этой ячейки в аккумулятор, декрементировать содержимое аккумулятора, и если бит ноляZбудет равен единице, выходить из цикла и сохранять результат в ячейки памяти 0900hи 0901h. И складывать содержимое ячеекAddr2 иAddr3. Это и будет наш третий байт.