Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Перевірка за допомогою демонстраційної програми правильності результатів, отриманих під час виконання індивідуального завдання у відповідності з п.4




Лабораторна робота № 5

МНОЖЕННЯ ЦІЛИХ ДВІЙКОВИХ ЧИСЕЛ

 

Мета роботи

 

В результаті виконання лабораторної роботи:

· вміти реалізовувати множення цілих двійкових чисел;

· вміти отримувати результати завдяки використанню машинного алгоритму множення цілих двійкових чисел.

 

Теми для попереднього пророблення

 

2.1.Лінійні і циклічні зсуви; використання стану ознаки CF, яка міститься в регістрі ознак процесора.

2.2. Переведення цілих чисел із 10-ї системи числення в 2-у і навпаки.

2.3. Отримання двійкових прямого (ПК) і додаткового (ДК) кодів.

Завдання до лабораторної роботи

 

3.1.Вибрати варіант завдання із табл. 1 за своїм номером в журналі групи.

 

Таблиця1 – Вихідні дані для виконання лабораторної роботи

Варіант Множене  А10 Множник   В 10 Варіант Множене  А10 Множник   В 10
1 16 –36 16 3 –27
2 28 33 17 –5 17
3 –25 15 18 8 20
4 12 33 19 –4 19
5 –36 17 20 4 –26
6 –32 –10 21 –17 13
7 9 –15 22 14 –19
8 11 28 23 23 6
9 –35 27 24 –8 –5
10 4 –19 25 21 2
11 –7 29 26 –5 28
12 20 15 27 3 35
13 30 –5 28 9 –12
14 6 14 29 13 6
15 34 –8 30 –7 21

 

 3.2.Отримати вручну цілі двійкові числа  А2 і В2 у форматі з фіксованою комою в прямому (ПК) і додатковому (ДК) кодах. Використати різні знаки у чисел, а саме: +А2, + В2, – А2 і – В2.

 3.3.Виконати вручну множення двійкових чисел А2 і В2. Використати при множенні додаткові коди і різні комбінації знаків у чисел, а саме: (+ А2,+ В2), (+А2,– В2), (–А2,+ В2)  і  (–А2,– В2).

3.4.Для всіх комбінацій знаків у чисел А2 і В2 отримати результати шляхом запускання демонстраційної програми.

3.5.Отримані після запускання демонстраційної програми результати порівняти з отриманими вручну.

3.6. Для наведеного в пп.4.4 і 4.5 одного з машинних алгоритмів множення цілих двійкових чисел в додатковому коді отримати вручну результати (див. приклад 3 у п.4.5). Використати два додатних числа із свого індивідуального завдання.

3.7. Отриманий в п.3.6 результат співставити з отриманим в п.3.3.

 

Хід отримання результатів

 

4.1.Множення цілих двійкових чисел зі знаком в прямому і додатковому коді виконується шляхом покрокового додавання значення множеного, яке зсувається, та часткової суми, якщо у відповідному розряді множника присутня одиниця.

4.2.При множенні чисел в прямому коді знакові та значущі розряди обробляються нарізно. Для визначення знака результату виконується додавання цифр, записаних в знакових розрядах операндів.

4.3. Множення цілих двійкових чисел в додатковому коді виконується по алгоритму, аналогічному множенню чисел в прямому коді, але знак результату отримується автоматично, при чому в операції множення приймають участь не тільки значущі, але і знакові розряди чисел. При цьому слід мати на увазі дві особливості. Якщо виконується множення множеного А на знакову одиницю від’ємного множника В, то необхідно для відповідного додавання використати не А, а [–А]дк. Якщо ж від’ємним числом являється множене, то в кожному додаванні приймають участь одиниці, які отримуються внаслідок дописування зліва перед множеним незначущих нулів і наступної інверсії множеного.

 

Приклад 1.

         A = +1010 = 0 10102 (множене);  [ А]дк = 0 1010

B = –1310 = 1 11012 (множник);    [ В]дк = 1 0011

 

01010

10011

01010                

   01010                  

   00000                    

00000                      

1 0110     

1 01111110 

 Під час множення на знакову одиницю множника В була виконана корекція – в якості останнього доданка використано [–А]дк = 1 0110.

Оскільки в знаковому розряді результату маємо 1, то це означає, що результатом множення є двійкове число в додатковому коді. Для переходу до прямого коду результат треба проінвертувати і виконати операцію додавання над проінвертованим кодом і одиницею:

 

1 10000001+1= 1 10000010.

Результат:

D =1 100000102 –>  –(1*27+0*26+0*25+0*24+0*23+0*22+1*21+0*20 ) = –(128+2) = –13010.

 

Приклад 2.

A = –1010 (множене);    [ А]дк = 1 0110

B = +1310 (множник);   [ В]дк = 0 1101

 

    1 0110

    0 1101

111110110               

    00000000                 

     1110110                    

     110110                      

  00000                   

101111110

Оскільки множене являється від’ємним числом, то при додаванні використані одиниці множеного, які отримані шляхом інверсії незначущих нулів в старших розрядах, при наявності ненульового розряду множника.

В знаковому розряді добутку маємо 1, отже результат множення отримали в додатковому коді. Для переходу до прямого коду результат треба проінвертувати і виконати операцію додавання над проінвертованим кодом і одиницею:

 

1 10000001+1= 1 10000010.

 

Результат:

 

D =1 100000102 = –(1*27+0*26+0*25+0*24+0*23+0*22+1*21+0*20) = –(128+2) = –13010

4.4. Машинний алгоритм, який розглянутий в даній лабораторній роботі, характеризується тим, що для множеного, множника і часткової суми використовуються регістри однакової довжини (наприклад, 8‑бітові). Результат (добуток) зберігається в парі регістрів, в одному з яких зберігалась часткова сума, а в другому – множник. При цьому старша частина результату розміщується в регистрі часткової суми, а молодша – в регистрі множника.

В даному алгоритмі виконуються такі дії:

1. Зсув множника на 1 розряд в сторону молодших розрядів з урахуванням в старшому розряді поточного вмісту ознаки CF, тобто виконання операції RCR.

2. Якщо значення, висунуте з правого розряду і відтворене в ознаці CF, не дорівнює 1, то перехід до 4-го пункту;

3. Додавання множеного з частковою сумою. Присвоєння ознаці CF значення 0.

4. Зсув часткової суми на 1 розряд в сторону молодших розрядів з урахуванням в старшому розряді поточного вмісту ознаки CF, тобто виконання операції RCR.

5. Якщо кількість виконань пунктів 1–4 не дорівнює кількості розрядів n у множника,то знову перейти до пункту 1.

6. Корекція значення молодшої частини результату множення шляхом зсуву множника на 1 розряд в сторону молодших розрядів з урахуванням в старшому розряді поточного вмісту ознаки CF, тобто виконання операції RCR.

 

 

Машинний алгоритм множення

 Схема одного з машинних алгоритмів множення наведена нижче.

 

 


     ні

 

 

                         так

 

 

           так

 

 

                         ні

 

 

    

 

Приклад 3.         A = 610 = 01102 (множене);

 B  = 310 = 00112 (множник);

 D = 00002 (часткова сума);

 N = 4

 

№ такту

Дія

Ознака [CF] i
0   0  
1 Зсув В вправо B = [0]001|1 1 0
2 [CF] = 1, отже додаємо множене до часткової суми; [CF] := 0 D = D + A 0  
3 Зсув D вправо D = [0]011|0 0  
4 Зсув В вправо B = [0]000|1 1  
5 [CF] = 1, отже додаємо множене до часткової суми; [CF] := 0 D = D + A 0 1
6 Зсув D вправо D = [0]100|1 1  
7 Зсув В вправо B = [1]000|0 0 2
8 Зсув D вправо D = [0]010|0 0  
9 Зсув В вправо B = [0]100|0 0 3
10 Зсув D вправо D = [0]001|0 0  
11 Зсув В вправо B = [0]010|0 0 4

 

Результат.   D:B –>  0001: 0010    000100102 = 1810.

 


Перевірка за допомогою демонстраційної програми правильності результатів, отриманих під час виконання індивідуального завдання у відповідності з п.4

5.1. Спочатку треба вручну для всіх комбінацій знаків у чисел отримати результати для свого індивідуального завдання, як це зроблено в прикладах у п.4.3.

5.2. Перевірити правильність отриманих в п.5.1 результатів за допомогою демонстраційної програми, текст якої розміщений нижче.

 

5.3. Демонстраційну програму треба запустити на виконання в одному з середовищ, яке підтримує програмування на мові Pascal.

5.4. Текст демонстраційної програми.

 

program umnozenie;

uses crt;

var

a,b:integer;

a_pr,b_pr:word;

a_dk,b_dk:word;

d:char;

 

function plusdk(a,b:word):word; {Сложение в дополнительном коде}

var

trans:word; {Бит переноса}

digit:word; {Текущий бит}

result:word; {Нужна для хранения промежуточного результата }

                 {при вычислении бита переноса}

c:word; {Сумма}

i:byte; {Счетчик}

begin

trans:=0;

for i:=0 to 15 do begin

digit:=(a and (1 shl i)) xor (b and (1 shl i)) xor (trans shl i);

if digit=0 then c:=c and (65535 xor (1 shl i))

else c:=c or (1 shl i);

result:=(a and (1 shl i))and(b and(1 shl i));

result:=result or ((b and(1 shl i))and(trans shl i));

result:=result or ((a and (1 shl i))and(trans shl i));

if result<>0 then trans:=1 else trans:=0;

end;

plusdk:=c; {Возвращение результата}

end;

 

function bdtos(a:word):string; {Преобразование битов числа в строку}

var

flag:boolean;

i:byte;

s:string;

begin

flag:=false;

s:='';

for i:=15 downto 0 do

begin

if ((1 shl i) and a)>0 then flag:=true;

if flag=true then s:=s+chr(ord(((1 shl i) and a)<>0)+48);

end;

if flag=false then s:='0';

bdtos:=s;

end;

 

function prtoi(a:word):integer; {Преобразование из прямого кода в integer}

begin

if a<32768 then prtoi:=a

else prtoi:=-(a and 32767);

end;

 

function itopr(a:integer):word; {Преобразование из integer в прямой код}

begin

if a>=0 then itopr:=a

else itopr:=abs(a) or (1 shl 15);

end;

 

function prdk(a:word):word; {Преобразование из прямого кода в дополнительный}

                                            {и наоборот}

begin

if a<32768 then prdk:=a

else prdk:=plusdk((not a) or (1 shl 15),1);

end;

 

function multdk(a,b:word):word;

var

c:word; {Результат}

i:byte; {Счетчик}

begin

c:=0;

for i:=0 to 14 do begin {Умножение на незнаковую часть В}

if (b and (1 shl i))<>0 then c:=plusdk(c,a);

a:=a shl 1;

end;

if (b and (1 shl 15))<>0 then {Умножение на знаковый бит В}

begin

a:=plusdk(not a,1); {Коррекция}

c:=plusdk(c,a);

end;

multdk:=c;

end;

 

begin

 while true do

 begin

clrscr;

textcolor(13);

       writeln('Ограничения:');

       writeln;

       textcolor(15);

 

write('Введите A и B через пробел: ');

readln(a,b);

a_pr:=itopr(a);

b_pr:=itopr(b);

 

a_dk:=prdk(a_pr);

b_dk:=prdk(b_pr);

writeln(' [A]пк = ',bdtos(a_pr));

writeln(' [B]пк = ',bdtos(b_pr));

writeln(' [A]дк = ',bdtos(a_dk));

writeln(' [B]дк = ',bdtos(b_dk));

writeln('дк [A]дк*[B]дк = ',bdtos(multdk(a_dk,b_dk)));

writeln('пк [A]пк*[B]пк = ',bdtos(prdk(multdk(a_dk,b_dk))));

writeln('10 [A]*[B] = ',prtoi(prdk(multdk(a_dk,b_dk))));

 

 gotoxy(30,25);

textcolor(15);

writeln('Нажмите: Enter - чтобы продолжить и ');

write('                                  1 - чтобы выйти');

d:=readkey;

if (d='1') then halt;

 end;

end.

 

Контрольні запитання

 

6.1. Особливості множення цілих двійкових чисел із знаком в ПК і ДК.

6.2. Що означає термін “часткова сума”?

6.3. Якщо множене або множник являється від’ємним числом, що треба мати на увазі при виконанні операції множення?

6.4. Як враховується стан ознаки CF регістра ознак процесора при виконанні команд циклічного зсуву?

 

Зміст звіту

 

7.1. Звіт треба оформити в зошиті для звітів або на аркушах формату А4.

7.2. Звіт може бути роздрукований.

7.3. При оформленні звіту треба використати українську мову.

7.4. В звіті мають бути вказані:

1) номер лабораторної роботи;

2) тема лабораторної роботи;

3) мета її виконання;

4) індивідуальне завдання;

5) результати виконання індивідуального завдання;

6) особливості функціонування демонстраційної програми і результати, отримані при її виконанні;

7) відповіді на контрольні запитання;

8) висновки по даній лабораторній роботі.

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 182.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...