Скачиваний:
20
Добавлен:
09.05.2014
Размер:
161.28 Кб
Скачать

Санкт-Петербургский государственный университет

информационных технологий, механики и оптики

Отчёт по лабораторным работам

по курсу: «Организация ЭВМ».

Выполнили:

студенты гр. 2100

Митрофанов Александр,

Пермяков Валерий;

Преподаватель:

Скорубский В.И.

Санкт-Петербург

2009 г.

Арифметика с фиксированной точкой

Ввод численных данных с фиксированной точкой (Перевод 10→2) с входного порта и контроль результата в выходном порте.

Машинные преобразования выполняются в двоичной системе пересчетом из 10 системы в 2

(A1.A0)2/10 - двоично-десятичное число, А1 и А0 – старшая и младшая тетрады, B2 двоичное число после пересчета содержит тоже самое число целых единиц – информация, содержащаяся в любой записи этого числа. Формула пересчета

(A1.A0)2/10 = (A1*(10)2 + A0)2 = В2

Вывод чисел с фиксированной точкой (Перевод 210) в выходной порт

Машинный метод – вычисления выполняются в двоичной системе делением на основание (10)2

A1=B/10; A0=B%10

Значение, полученное при переводе 10→2 в порте P2, преобразовать в двоично-десятичное и вывести в порт Р3. Совместить перевод 102 и 210 в одной программе

Реализация задачи на С++

#include <reg51.h>

main()

{

// 2->10

P2=((P1&0xf0)>>4)*10 + (P1&0x0f);

// 10->2

P3=((P2/10)<<4) + (P2%10);

}

Реализация задачи на ассемблере

cseg at 0

//10->2

mov a,P1

anl a,#0f0h

swap a

mov b,#10

mul ab

mov b, a

mov a, P1

anl a,#0fh

add a, b

mov P2, a

//2->10

mov a, P2

mov b,#10

div ab

swap a

add a,b

mov P3, a

end

Программа беззнакового деления

Деление 16-разрядного числа на 8-разрядное, операнды вводятся с портов, целый результат выводится в порт.

Алгоритм ускоренного деления дробных чисел с фиксированной точкой перед старшим разрядом реализовать по рекуррентной формуле – обратной по отношению к формуле умножения

Если Sn=2-1(Sn-1+Ab1), то b1 =1, если Sn-1 = 2Sn-A >=0, иначе b1 =0.

И так далее на каждом шаге bi =1, Sn-i = 2Sn-i-1-A >=0, иначе bi =0.

Изменяя нумерацию остатков, приходим к следующей рекуррентной формуле с восстановлением остатка в случае отрицательной разности.

Следующий шаг с восстановлением остатка

2((2Sn-i-1-A) + А)-А = 2Sn-i +2А –А=2Sn-i

Таким образом, рекуррентные формулы для ускоренного (без восстановления остатков) деления дробных чисел B= S/A

Si+1= 2Si+A, bi=0, если Si<0

2Si-A, bi=1, если Si>=0

Si – остаток, i=0,1,2,…8, S0 – делимое, B-делитель, bi-цифра частного

Схема вычислений.

1 n 1 n

, S S/B bi

+/-A

, А 2S(сдвиг влево)

Регистр S/B совмещает младшие разряды делимого при сдвиге и старшие разряды частного

Реализация задачи на С++

#include <reg51.h>

main()

{

int S,A;

char i,B=0;

S = (P0<<8)+P1;

A = P2<<8;

for (i=0;i<8;i++)

{

S = (S>=0)? (S<<1)- A: (S<<1)+A;

B = (S>=0)? (B<<1)+0x01: (B<<1);

}

P3 = B;

}

Реализация задачи на ассемблере

cseg at 0

mov R0, P0 // S1

mov R1, P1 // S0

mov R2, P2 // A

mov R3, #8

mov R4, #0 //B

label:

mov B, R2

mov A, R1

clr c

rlc A

mov R1, A

mov A, R0

rlc A

jc label1

clr c

subb A, B

mov R0, A

jnc label2

jc label3

label1:

add A,B

mov R0,A

rlc A

jnc label2

jc label3

label2:

mov A, R4

rl A

inc A

mov R4, A

jc label4

jnc label4

label3:

mov A, R4

rl A

mov R4, A

jc label4

jnc label4

label4:

djnz R3, label

mov P3, R4

end