Арифметические основы построения ЭВМ
Операции над десятичными числами (десятичная арифметика) часто включается в cocтaв основных команд универсальных ЭВМ. Кроме того десятичная арифметика реализуется широко в электронных калькуляторах и персональных микроЭВМ. Поэтому кроме общей информацмии о возможности представления десятичных чисел разработчику необходимо знать и алгоритм выполнения арифметических операций. При суммировании двух… Читать ещё >
Арифметические основы построения ЭВМ (реферат, курсовая, диплом, контрольная)
Чувашский государственный университет имени И. Н. Ульянова Кафедра Вычислительной техники КУРСОВАЯ РАБОТА по информатике на тему:
«Арифметические основы построения ЭВМ»
Выполнил: студент гр. ИВТ 41−08
Михайлов Л.В.
Проверил: преподаватель
Стеценко В.Г.
г. Чебоксары
Цель:
Целью курсовой работы является закрепление основных теоретических положений предмета информатики, приобретение навыков практического решения технических задач и логического проектирования узлов ЭВМ.
Задача:
Разработать алгоритм и программу операции деления целых чисел в формате «Упакованное десятичное» на сумматоре прямого кода. Десятичное число содержит не более 18 цифр.
В коде 8421.
Разрядная сетка машины — 80 разрядов.
Описание формата;
Операции над десятичными числами (десятичная арифметика) часто включается в cocтaв основных команд универсальных ЭВМ. Кроме того десятичная арифметика реализуется широко в электронных калькуляторах и персональных микроЭВМ. Поэтому кроме общей информацмии о возможности представления десятичных чисел разработчику необходимо знать и алгоритм выполнения арифметических операций.
Д-код (двоично-кодированное представление) десятичного числа — такое его представление, в котором каждая десятичная цифра изображается тетрадой из двоичных символов.
Разрешённые комбинации:
Десятичный разряд: | Двоичная комбинация: | |
Остальные комбинации — запрещенные. Появление таких комбинаций означает ошибку или необходимость обработки результата (коррекция).
Диапазон представления чисел
Диапазон представления чисел для нашей задачи следующий:
Минимальное положительное значение определяется следующим образом:
Х=0 0 0000…0001
т.е. Х=1
А максимальное:
Х=0 0 100 110 011 001…10 011 001
т.е Х=1 000 000 000 000 000 000
минимальное по модулю отрицательное:
Х=1 0 0000…0001
т.е. Х=-1
А максимальное по модулю отрицательное:
Х=1 0 100 110 011 001…10 011 001
т.е Х=-1 000 000 000 000 000 000
)Разработка алгоритма преобразования десятичного числа в BCD формат
1) На вход программа получает две строки с максимальным количеством символов, равным 18.
Так как пользователь может ошибиться (ввести вместо цифры символ или ввести слишком много цифр), понадобятся дополнительные проверки.
1. После считывания строки проверяется её длина. Если она превышает 19, тогда флагу ошибочной длины присваивается значение true.
2. Если же нет то проверяется на наличие знака «- «если он присутствует, тогда проводиться перевод i-ого символа в двоичный код столько раз, какова длина строки не считая первого так как он является «- «.
3. Если же знак «- «отсутствует, то проверяется его длина. Если она не превышает 18, то проводится перевод i-ого символа в двоичный код столько раз, какова длина строки. При превышении, флагу ошибочной длины присваивается значение true.
ГСА преобразования строки в заданный формат представлена на Рис.1
2) При переводе i-ого символа в формат «упакованное десятичное» полученный двоичный код будет храниться в байте, по две тетрады в каждом.
1. Проверяется является ли полученный символ цифрой. В случае отрицательного результата флагу не числа присваивается значение true.
2. В противном случае находят номер элемента хранения и определятся надобность сдвига в лево на 4 разряда. Далее полученная цифра добавляется в элемент хранения со с сдвигом или без.
ГСА упаковки цифры в элемент хранения представлена на Рис. 2
Рис1.ГСА перевода полученной строки в BCD формат
Рис. 2 ГСА п/п перевода цифры в двоичный код
Пример перевода из строки в число формата BCD На входе строка: «1 986 258 163»
Цифра 3 имеет код 0011
6 0110
1 0001
7 1000
5 0101
2 0010
6 0110
8 1000
9 1001
1 0001
Получаем :
Разработка алгоритма арифметической операции.
Для определения формальных правил поразрядного сложения чисел, представленных в Д-коде, рассмотрим те особенности, которые присущи этим кодам.
1. Наличие запрещённых комбинаций.
Её появление свидетельствует о ошибке или же о необходимости коррекции результата.
2. При сложении тетрад возникает потетрадный перенос. Это также приводит к необходимости коррекции результата.
В самом деле, если складывать и,
то сумма равна
Где — I — ый разряд суммы; Пi-1 — перенос из младшей тетрады; Пi — перенос в старшую тетраду.
Если при сложении в данном разряде числа образуется сумма меньше 10, то правильный результат получают без коррекции.
В случае если сумма больше или равна 10, то требуется коррекция результата в данной тетраде введением поправки, равной +0110.
)Пример сложения целых чисел в формате «упакованное десятичное»
Алгоритм операции сложения
Сначала проверяют числа на знаки. Если они оба положительны или отрицательны, то числа суммируются без каких либо изменений.
Если же они имеют разные знаки, то число со знаком `-` переводиться в дополнительный код, после чего их складывают.
Если результат имеет отрицательный, то число переводят в прямой код, если нет, то результат не меняют.
При суммировании двух чисел берется по одной цифре (тэтраде) из каждого числа, складываются и проверяют, они больше 9 или нет. Если больше, то от результата сложения отнимается 10-ка и переносу присваивают значение равное единице. В противном случае с результат не меняют.
Все повторяется столько раз, какова максимальная длина входной строки.
Перевод в дополнительный код проводиться следующим образом: сначала к каждой цифре прибавляется 6-ка, далее всё число инвертируется и к нему прибавляется еденица
Обратный перевод (из дополнительного в прямой) инвертируется число и из каждого вычитается 6-ка, затем прибавляется еденица
программа код чило сумматор эвм
Рис. 3 ГСА арифметической операции Рис. 4 ГСА пп суммы чисел
Рис. 7 ГСА Вывода двоиного Рис. 8 ГСА пп перевода в
представления числа дополнительный код
Результат работы алгоритма
Рис. 11 Сложение.
Рис. 12 Вывод помощи.
Приложение:
unit Adding;
interface
const
cod: array[1.11] of string =('0000','0001','0010','0011','0100','0101','0110','0111','1000','1001','errr');
n=9;
type
pack=array [1.10] of byte;
var
vvod, vivod: string[20];
A, B, C:pack;
i, j, k:byte;
symb:boolean;
long, bola, bolb: boolean;
procedure Auto;
procedure Step;
implementation
uses crt;
procedure box (f:byte ;str:string; var X: pack);
var
z, q: byte;
begin
j:=0;
symb:=false;
q:=length (str);
for i:=20 downto f-q do
begin
j:=ord (str[q])-48;
dec (q);
k:=round (i/2);
z:=4*(i mod 2);
X[k]: =X[k]+ j shl z;
end;
end;
procedure obnul (var x: pack);
var q: byte;
begin
for q:=1 to 10 do
x[q]: =0;
end;
procedure vivd (x:pack);
begin
for j:=1 to 10 do
write (X[j],'|');
writeln;
end;
procedure Boxing (var X: pack);
begin
obnul (x);
readln (vvod);
box (21,vvod, X);
vivd (x);
end;
procedure perevod (var x: pack);
begin
obnul (x);
readln (vvod);
if length (vvod)<=19 then
if vvod[1]='-' then
begin
x[1]: = 8 shl 4;
box (22,vvod, x);
end
else
begin
if length (vvod)<19 then
begin
box (21,vvod, x);
end
else
long:=true
end
else
long:=true;
end;
function gettetr (X:pack; p: byte): byte;
var
z, r: byte;
begin
z:=round (p/2);
r:=X[z] shr 4;
if p mod 2 = 0 then
gettetr:=x[z] - r shl 4
else gettetr:=r;
end;
procedure vivdcode (X:pack);
var q, e: byte ;
begin
for q:=1 to 20 do
begin
e:=gettetr (x, q);
if e<=9 then
write (cod[e+1])
else write (cod[11]);
end;
writeln;
end;
procedure tetrsum (x, y: pack;var z: byte; p: byte ;v:byte);
var e, r: byte;
begin
e:=0;
r:=0;
e:=gettetr (x, p);
r:=gettetr (y, p);
z:=e+r+v;
end;
procedure sum (x, y: pack; var d: pack);
var
q, e, g, k, z, cj, h: byte;
begin
obnul (d);
cj:=0;
for q:=20 downto 3 do
begin
tetrsum (x, y, e, q, cj);
cj:=0;
k:=round (q/2);
h:=q mod 2;
if e>9 then
begin
e:=e-10;
cj:=1 ;
end;
z:=4*h;
d[k]: =d[k]+ e shl z;
end;
end;
procedure bolshe (x, y: pack; var bool1, bool2:boolean);
var i: word;
begin
bool1:=false;
bool2:=false;
i:=2;
repeat
if x[i]>y[i] then bool1:=true
else bool2:=true;
inc (i);
until (i>10) or (bool1=true) or (bool2=true);
end;
procedure deBox (X:pack);
var q, z: byte;
vh:string[20];
begin
vh:='0';
for q:=20 downto 3 do
begin
z:=gettetr (x, q);
vh[q]: =char (z+48);
end;
write (vh);
end;
procedure addnum (var x: pack;num:byte);
var q, i, e, r, z, k, cj:byte;
d:pack;
begin
cj:=0;
d:=x;
obnul (x);
for q:=20 downto 3 do
begin
e:=gettetr (d, q);
e:=e+num+cj;
num:=0;
cj:=0;
k:=round (q/2);
i:=q mod 2;
if e>9 then
begin
e:=e-10;
cj:=1 ;
end;
z:=4*i;
x[k]: =x[k]+ e shl z;
end;
end;
procedure dop (var x: pack);
var q: byte;
begin
for q:=2 to 10 do
begin
x[q]: = x[q] + $ 66;
x[q]: = not x[q];
end;
x[q]: = x[q] + 1;
end;
procedure undop (var x: pack);
var q: byte;
begin
for q:=2 to 10 do
begin
x[q]: =not x[q];
x[q]: =x[q] - $ 66;
end;
addnum (x, 1);
end;
procedure Auto;
begin
writeln ('Insert A');
perevod (a) ;
vivdcode (a);
if (long=false) and (symb=false) then
begin
writeln ('Insert B');
perevod (b);
vivdcode (b);
if (long=false) and (symb=false) then
begin
If a[1]=b[1] then
begin
Sum (A, B, C);
writeln ('C=A+B');
writeln ('C in BCD');
vivdcode (c);
debox (c);
writeln;
end
else
begin
if a[1]<> 0 then
begin
dop (a);
writeln ('A in dop');
vivdcode (a);
end
else
begin
dop (b);
writeln ('B in dop');
vivdcode (b);
end;
sum (A, B, C);
writeln ('C=A+B');
writeln ('C in BCD');
bolshe (a, b, bola, bolb);
if c[2]<>0 then
undop (c);
vivdcode (c);
debox (c);
end;
end;
end;
end;
procedure min (X:pack);
var q, e: byte ;
begin
for q:=3 to 20 do
begin
e:=gettetr (x, q);
if e<=9 then
write (cod[e+1])
else write (cod[11]);
end;
writeln;
end;
procedure show;
begin
writeln ('C=A+B');
min (A);
writeln ('+');
min (B);
writeln ('___');
end;
procedure Step;
var u: byte; ch: char;
begin
u:=0;
writeln ('Press «n» to chouse next position ');
repeat
ch:=readkey;
if ch = 'n' then inc (u);
case u of
1:begin
writeln ('Insert A');
perevod (a) ;
if (long=false) and (symb=false) then
begin
writeln ('Insert B');
perevod (b);
writeln ('A in BCD');
vivdcode (a);
writeln ('B in BCD');
vivdcode (b);
end;
end;
2:begin
if (long=false) and (symb=false) then
begin
if a[1]=b[1] then
begin
show;
Sum (A, B, C);
min (c);
writeln (^M^J,'C in BCD');
vivdcode (c);
debox (c);
writeln;
end
else
begin
if a[1]<> 0 then
begin
dop (a);
writeln ('A in dop');
vivdcode (a);
end
else
begin
dop (b);
writeln ('B in dop');
vivdcode (b);
end;
sum (A, B, C);
writeln ('C=A+B');
writeln ('C in BCD');
if c[2]<>0 then
undop (c);
vivdcode (c);
debox (c);
end;
end;
end;
end;
until (u=2);
end;
end.
Модуль Main
uses crt, Adding, Winw;
var
f:byte;
begin
glavwin;
repeat
CH:=readkey;
case ch of
char (19):begin clrscr; Step; end;
char (1): begin clrscr; Auto; end;
char (27): ggg:= True;
char (8): help;
else Beep;
end;
until ggg=true;
end.