Деление в цифровых процессорах
Автор: 10kazak • Сентябрь 12, 2023 • Лабораторная работа • 2,727 Слов (11 Страниц) • 136 Просмотры
Министерство науки и высшего образования
Пензенский государственный университет
Кафедра “Вычислительная техника”
Отчет
по лабораторной работе №9
по курсу “Арифметические и логические основы вычислительной техники”
на тему “Деление в цифровых процессорах”
Вариант № 2
Выполнили
студенты группы 22ВВП2:
Байков А.В
Гавин В.Н
Дулатов Д.В
Принял
Калиниченко Е.И
Пенза 2023
Лабораторное задание:
Написать на языке ассемблера программу вычисления выражения
Y=(2*В+А)*С/(B-200).
Процессор имеет разрядность – 16 бит. Исходные данные (значения переменных заданного выражения - целые, 16-битовые со знаком) располагаются в оперативной памяти, результат вычисления также поместить в оперативную память.
Деление переменных при вычислении выражения осуществлено с помощью операций сложения, вычитания, сдвига.
Умножение и деление на константы осуществлено с помощью операций сдвига, сложения и вычитания.
Общий алгоритм вычисления выражения приведен на блок-схеме:
[pic 1]
Переполнение возможно при умножении A на 3 и деление на ноль, если (3 * А) = 0
Остальные переполнения были разобраны в 8-й лабораторной работе
Переполнение при делении, когда частное выходит за пределы 16 бит невозможно
Размерность 16-разрядного процессоре составляет [-32768; 32767]
Максимальное число, которое может получится:
А = 10922
B = 32767
С = 0
((((10922 / 4) + 32767) / 2) - ((0 / 4) & 127)) * 10922) / (3 * 10922) =
= ((17748 - 0) * 10922) / (32766) = 193851848 / 32766 = 5916
Листинг:
data segment
a dw ?
b dw ?
c dw ?
y1 dw ?
y2 dw ?
сhast dw ?
ost dw ?
good db ?
overflow db ?
del dw ?
del_neg dw ?
mask dw 8000h ;маска для определения знака=1000 0000 0000 0000
data ends
code segment
assume cs: code, ds:data, ss: nothing
start:
mov ax, data
mov ds,ax
mov good, 0 ;флаг нормального завершения
mov overflow, 0 ;флаг аварийного завершения
; вычисление 1/4*a
mov ax, a
sar ax, 1
sar ax, 1
; вычисление 1/4*a + b
add ax, b
; проверка на переполнение
jno l1
jmp overflowerror
l1:
; вычисление (1/4*a + b) / 2
sar ax, 1
; вычисление c / 4
calc_y:
mov bx, c
sar bx, 1
sar bx, 1
; вычисление (c / 4) & 127
and bx, 127
; вычисление ((1/4*a + b) / 2) - ((c / 4) & 127)
sub ax, bx
;умножение ((1/4*a + b) / 2) - ((c / 4) & 127)*a
mov bx, a
;проверка знаков
mov dx, mask
mov cx, dx
;определение знака 2*b+a
and dx, ax ;выполняет логическое и между всеми битами операндов; если 1 и 1 = 1, значит, 2*b+a - отрицательное число
jz plus_sum
not ax ;инверсия и +1 (след. шаг), если число отрицательное
inc ax
mov dx, 1
plus_sum:
and cx, bx ;определение знака с
jz plus_c
not bx ;инверсия и +1 (след. шаг), если число отрицательное
inc bx
mov cx, 1
plus_c:
xor dx, cx ;1*1=0, 0*0=0, 1*0=1
push dx ;сохранение знака произведения в стек
;выполнение умножения
xor dx, dx
mov cx, 15
;множимое 2*b+a в ax, множитель c в bx
mul_c:
rcr bx,1 ; начало цикла алгоритма умножения – сдвиг регистра множителя
jnc a_1 ; проверка выдвинутого разряда - если бит равен 0, то сдвиг
add dx, ax ; иначе сложение
a_1:
rcr dx, 1 ; сдвиг сумматора
...