Министерство образования и науки Российской Федерации
ФГБОУ ВПО «Магнитогорский государственный технический университет» им. Г. И. Носова
Кафедра Электроники и микроэлектроники
Курсовая работа
по дисциплине «Машинные языки программирования»
Вариант №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. Поэтому для ответа понадобится три ячейки памяти. Так как числа имеют особый формат (знак числа находится в нулевом бите младшего байта), знак нужно поставить на место седьмого бита старшего байта. Для этого,будем действовать по следующему алгоритму:
В аккумулятор загружается младший байт числа;
Содержимое аккумулятора сдвигается вправо без переноса;
Производится операция логическое “И”;
Заготовленная маска сохраняется в регистр Е;
После второй операции бит переноса Cустановился в значение, нам неизвестное, поэтому установим его в значение “0” (чтобы потом при помощи сдвига вправо с переносом на место седьмого бита старшего байта встал 0);
В аккумулятор загружается старший байт числа;
Содержимое аккумулятора сдвигается вправо с переносом (теперь бит переноса С равен значению нулевого бита старшего байта) и на место седьмого бита встал 0;
Производим операцию логическое “ИЛИ” содержимого аккумулятора с маской, хранящейся в регистре E;
Старший байт готов, перемещаем его в регистр D;
Теперь нужно, чтобы на место седьмого бита младшего байта, встал нулевой бит старшего байта;
Загружаем в аккумулятор младший байт в первоначальном виде;
Содержимое аккумулятора сдвигаем вправо с переносом;
Младший байт готов, перемещаем его в регистр E.
Регистровая пара BCбудет содержать адрес текущей ячейки массива чисел, то есть байта. При сложении чисел, будут складываться содержимое регистровых парHLиDE,HL- будет содержать промежуточный результат сложения, аDE- следующее число. Поэтому перед началом основной программы, регистровую паруHLнужно обнулить.
После загрузки старшего байта в регистр D, сразу же будем проверять число на знак, для этого в аккумулятор загрузим содержимое ячейки памяти с адресомAddr3 (где первоначально будут содержаться нули), если число будет отрицательное. Прибавим к содержимому аккумулятораFFh, перезапишем содержимое аккумулятора в ту же ячейку памятиAddr3. После сложения чисел, будем проверять перенос из старшего бита. Для этого, если будет перенос, в аккумулятор загрузим содержимое ячейки памятиAddr2, где тоже первоначально будут нули, проинкрементируем содержимое аккумулятора, сохраним в ту же ячейку памятиAddr2. Чтобы выйти из цикла сложения, нам понадобится счетчик чисел, для этого в начале программы загрузим в ячейку памятиAddr1 число 5. После проверки на перенос, будем загружать содержимое этой ячейки в аккумулятор, декрементировать содержимое аккумулятора, и если бит ноляZбудет равен единице, выходить из цикла и сохранять результат в ячейки памяти 0900hи 0901h. И складывать содержимое ячеекAddr2 иAddr3. Это и будет наш третий байт.