
- •Арифметика с фиксированной точкой
- •Реализация задачи на ассемблере
- •Программа беззнакового деления
- •Реализация задачи на ассемблере
- •Вычисление функции
- •Иерархия памяти эвм
- •Программа на c:
- •Битовые операции.
- •Реализация задачи на ассемблере
- •Таймеры
- •Программа часы.
- •Реализация задачи на с
- •Реализация задачи на ассемблере
- •Формирование серии прямоугольных сигналов - метод шим
- •Реализация задачи на с
- •Реализация на ассемблере
- •Adc преобразователь sab515/535
- •Реализация задачи на с
- •Сигнальная функция
- •Реализация задачи на с
- •Сигнальная функция
- •Реализация задачи на ассемблере
Санкт-Петербургский государственный университет
информационных технологий, механики и оптики
Отчёт по лабораторным работам
по курсу: «Организация ЭВМ».
Выполнили:
студенты гр. 2100
Митрофанов Александр,
Пермяков Валерий;
Преподаватель:
Скорубский В.И.
Санкт-Петербург
2009 г.
Арифметика с фиксированной точкой
Ввод численных данных с фиксированной точкой (Перевод 10→2) с входного порта и контроль результата в выходном порте.
Машинные преобразования выполняются в двоичной системе пересчетом из 10 системы в 2
(A1.A0)2/10 - двоично-десятичное число, А1 и А0 – старшая и младшая тетрады, B2 двоичное число после пересчета содержит тоже самое число целых единиц – информация, содержащаяся в любой записи этого числа. Формула пересчета
(A1.A0)2/10 = (A1*(10)2 + A0)2 = В2
Вывод чисел с фиксированной точкой (Перевод 2→10) в выходной порт
Машинный метод – вычисления выполняются в двоичной системе делением на основание (10)2
A1=B/10; A0=B%10
Значение, полученное при переводе 10→2 в порте P2, преобразовать в двоично-десятичное и вывести в порт Р3. Совместить перевод 10→2 и 2→10 в одной программе
Реализация задачи на С++
#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