Моделирование операции умножения
Выполнение программы начинается с последовательного ввода цифр множимого. Ввода числа выполняется слева направо, то есть ввод числа начинается со старших разрядов; выполняется в десятичной системе счисления. Запись целого числа в регистр осуществляется согласно следующему алгоритму: ранее записанное число умножается на основание системы счисления (в данном случае, на 10) и к полученному… Читать ещё >
Моделирование операции умножения (реферат, курсовая, диплом, контрольная)
Моделирование операции умножения
Основная цель данной курсовой работы заключается в составлении программы, реализующей моделирование операции умножения, начиная со старших разрядов множителя, при сдвиге суммы частичного произведения влево и неподвижным множителем.
В данной работе будет рассмотрен принцип решения задач, основанный на применении заданного алгоритма, а также исследованы особенности реализации программы на алгоритмическом языке Assembler. Для проверки правильности составления алгоритма целевой программы, также будет выполнено тестирование программы со сравнением результатов ручной обработки и полученных с помощью разработанного программного обеспечения.
1. Принцип решения поставленной задачи
В основу разрабатываемого алгоритма программы входит метод умножения, начиная со старших разрядов множителя, при сдвиге суммы частичного произведения влево и неподвижном множимом.
Данный метод заключается в поразрядном анализе множителя, начиная с его старших разрядов, и поочередном выполнении сдвига частичного произведения влево. Исходные числа (множимое и множитель) берутся по модулю. Операция умножения состоит из ряда последовательных операций сложения частичных произведений. Операциями сложения управляют разряды множителя: если в каком-то разряде множителя находится единица, то к сумме частичных произведений добавляется множимое с соответствующим сдвигом (влево или вправо), если в разряде множителя — ноль, то множимое не прибавляется, но учитывается, что в последующей операции анализа разряда множителя надо сделать дополнительный сдвиг. Последний сдвиг частичного произведения не выполняется.
Пример решения задачи.
0,101 | Ч | |||||||
< | ||||||||
< | ||||||||
< | ||||||||
2. Реализация алгоритма на языке программирования Assembler
В качестве основного алгоритмического языка разработки был выбран язык программирования Assembler, так как, являясь языком низкого уровня, он оптимально подходит для моделирования работ, связанных с хранением и обработкой информации, находящейся в регистрах, а также может выполнять все виды логических операций, необходимых для реализации метода.
Для хранения данных в ЦПУ используются следующие регистры:
Регистр AX — множимое;
Регистр BX — множитель;
Регистр CX — регистр-счетчик циклов;
Регистр DX — результат, содержит сумму частичных произведений.
Во время выполнения программы, назначение регистров может динамически изменяться, вследствие чего, во избежание потерь данных, значения соответствующих регистров будут сохраняться в стек, и при необходимости будет извлечено из памяти.
Во время разработки программы были использованы функции SHL (сдвиг влево), SHR (сдвиг вправо), CMP (сравнение), логические операции AND (И), NOT (НЕ), XOR (исключающее ИЛИ) и арифметические операции ADD (сложение), SUB (вычитание), MUL (умножение), DIV (деление).
Программа состоит из основной подпрограммы и трех пользовательских процедур: PRINTBIN, PBALG и PBALG8.
Основная подпрограмма.
Выполнение программы начинается с последовательного ввода цифр множимого. Ввода числа выполняется слева направо, то есть ввод числа начинается со старших разрядов; выполняется в десятичной системе счисления. Запись целого числа в регистр осуществляется согласно следующему алгоритму: ранее записанное число умножается на основание системы счисления (в данном случае, на 10) и к полученному произведению прибавляется введенное число. В случае ввода минуса, выполняется инвертирование значения регистра SI, который определяет знак конечного результата.
Аналогичные операции проводятся при вводе множителя.
Оба числа выводятся на экран в двоичной системе счисления с помощью процедуры PRINTBIN. Формат выводимого числа представлен знаковым разрядом и мантиссой.
Далее выполняется установка счетчика циклов, представленного регистром CX. После этого выполняется сдвиг влево значения частичного произведения, хранящегося в регистре DX и сдвиг влево значения множителя (регистр BX). Так как при сдвиге значения множителя старший разряд переносится за пределы регистра BL, то он попадает в регистр BH, где проводится его анализ. В случае если значение регистра BH равно 1, то к значению регистра DX (частичного произведения) прибавляется значение регистра AX (множителя). В обратном случае, данный шаг пропускается. Далее выполняется очистка регистра BH с целью удаления проанализированного разряда множителя. Все эти операции повторяются до тех пор, пока счетчик циклов не будет равен 0.
Результат проведенных операций хранится в регистре DX.
Далее выполняется отображение полученного числа в десятичной форме на экране. Принцип вывода значения заключается в последовательном делении конечного результата на основание системы (в данном случае, на 10) и последующего анализа частного и остатка. При необходимости, также на экран выводится знак минуса.
Во время выполнения программы для просмотра выполненных действий производится вывод промежуточных результатов на экран с помощью процедур PBALG и PBALG8.
Процедура PRINTBIN
Основное предназначение данной процедуры заключается в выводе введенного числа в двоичной системе счисления.
Принцип вывода двоичного числа заключается в последовательном делении значения регистра AX (содержит выводимое число) на основание системы «2». Само число формируется путем добавления значения остатка от деления в стек. Таким образом, готовое число записывается справа налево (в обратном порядке). При выводе числа на экран порядок восстанавливается.
Процедура PBALG
Основное предназначение данной процедуры заключается в выводе промежуточных результатов на экран в виде 16-разрядного двоичного числа.
Принцип вывода заключается в последовательном делении значения регистра AX (содержит выводимое число) на основание системы «2». Получаемое число записывается в 16-разрядную сетку; все незначащие нули, располагаемые в старших разрядах мантиссы, учитываются и записываются в стек.
Процедура PBALG8
Основное предназначение данной процедуры заключается в выводе промежуточных результатов на экран в виде 8-разрядного двоичного числа.
Принцип вывода заключается в последовательном делении значения регистра AX (содержит выводимое число) на основание системы «2». Получаемое число записывается в 16-разрядную сетку, начиная с восьмого разряда. Разряды с 0 по 7 заполняются пробелами, что позволяет смоделировать ситуацию выполнения операции сложения множимого и младших разрядов частичного произведения при выводе на экран.
Текст разработанной программы на языке Ассемблер представлен в приложении А.
3. Анализ результатов
Для тестирования программы были использованы следующие исходные данные:
A = 115 = 1 110 011
B = 103 = 1 100 111
Для проверки правильности составления программы вычисления были рассмотрены четыре случая:
Первый случай.
A = 115 = 0,1 110 011
B = 103 = 0,1 100 111
Второй случай.
— A = -115 = 1,1 110 011
B = 103 = 0,1 100 111
Третий случай.
A = 115 = 0,1 110 011
— B = -103 = 1,1 100 111
Четвертый случай.
— A = -115 = 1,1 110 011
— B = -103 = 1,1 100 111
Так как при решении задачи множимое и множитель берутся по модулю, то для ручной проверки будет рассматриваться только первый случай.
Результат: 0,10 111 001 000 1012 = 11 84510
Результат выполнения программы для 4 возможных случаев представлен в приложении Б.
Заключение
В результате выполнения данной курсовой работы была разработана программа моделирования операции умножения, начиная со старших разрядов множителя, при сдвиге суммы частичного произведения влево и неподвижным множителем.
В процессе разработки программного обеспечения был рассмотрен принцип решения задачи заданным методом, составлен текст основной подпрограммы и сопутствующих пользовательских процедур, проанализированы возможные варианты проверки правильности работы составленной программы и проведено тестирование, в результате которого были сравнены данные полученные путем ручной обработки и с помощью программы.
Разработанная программа моделирования операции умножения позволяет подробно исследовать заданный метод умножения, отследить все выполняемые при решении операции и просмотреть промежуточные результаты. Данная программа может быть использована как наглядное пособие для изучения заданного алгоритма умножения, либо для детальной проверки результатов, полученных путем решения задачи без использования программы.
1) Цилькер Б. Я., Орлов С. А. «Организация ЭВМ и систем: Учебник для вузов» — СПб.: издательство «Питер», 2004;
2) Крупник А. Б. «Изучаем Ассемблер» — СПб.: издательство «Питер», 2004;
3) Конспект лекций по дисциплине «Организация ЭВМ и систем»;
4) Конспект лекций по дисциплине «Ассемблер».
Приложение А
Листинг программы.
model small
stack 200h
data
ms0 db 'PROGRAM FOR MULTIPLACTION NUMBERS', '$';
ms1 db?, 13,10,'Enter the first number (A) (0−127):', '$'; строки
ms1a db?, 13,10,'|A| = 0,', '$'; для
ms2 db?, 13,10,'Enter the second number (B) (0−127):', '$'; вывода
ms2a db?, 13,10,'|B| = 0,', '$'; на
ms3 db?, 13,10,'Vychisleniya:', 13,10,'$'; экран
mse db?, 13,10,'The result is ', '$';
code
printbin proc; начало процедуры PRINTBIN
push AX; сохранение содержимого регистра AX в стек
mov CX, 0; установка счетчика циклов в «0»
M1:
mov BX, 2; запись делителя
div BX; выполнение деления
add DX, '0'; добавление кода «0» для получения кода остатка
push DX; сохранение кода остатка в стек
inc CX; увеличение счетчика циклов на «1»
cmp AX, 0; сравнение частного и «0»
jne M1
M2:
pop DX; извлечение кода из стека
mov AH, 02h; установка функции вывода символа на экран
int 21h;
dec CX; уменьшение счетчика циклов на «1»
cmp CX, 0; сравнение значения счетчика циклов и «0»
jne M2
pop AX; извлечение изначального значения AX из стека
ret; перемещение указателя на строку прерывания
printbin endp; конец процедуры PRINTBIN
pbalg proc; начало процедуры PBALG
push AX;
push BX; сохранение содержимого
push CX; регистров в стек
push DX;
mov DX, DI;
push AX;
mov AH, 02h; вывод на экран символа операции, хранящегося в DI
int 21h;
pop AX;
mov CX, 16; установка счетчика циклов
M3:
mov DX, 0;
mov BX, 2; задание делимого и делителя для операции деления
div BX; с последующим получением ASCII кода остатка
add DX, '0';
push DX; сохранение ASCII кода остатка в стек
M3A:
loop M3
mov CX, 16; установка счетчика циклов
M4:
pop DX;
mov AH, 02h; вывод на экран числа, хранящегося в стеке
int 21h;
loop M4
mov AH, 02h;
mov DL, 13; перенос курсора вниз на одну строку
int 21h;
mov DL, 10; перенос указателя в начало строки
int 21h;
pop DX;
pop CX; извлечение начальных значений
pop BX; регистров из стека
pop AX;
ret
pbalg endp; конец процедуры PBALG
pbalg8 proc; начало процедуры PBALG8
push AX;
push BX; сохранение содержимого
push CX; регистров в стек
push DX;
mov DX, DI;
push AX;
mov AH, 02h; вывод на экран символа операции, хранящегося в DI
int 21h;
pop AX;
mov CX, 16; установка счетчика циклов
A3:
mov DX, 0;
mov BX, 2; задание делимого и делителя для операции деления
div BX; с последующим получением ASCII кода остатка
add DX, '0';
push DX; сохранение кода остатка в стек
A3A:
loop A3
mov CX, 16; установка счетчика циклов
A4:
pop DX; извлечение значения из стека для вывода
cmp CX, 9; анализ счетчика циклов
jb A4A
mov DL, ' '; установка пробела для вывода на экран
A4A:
mov AH, 02h; вывод на экран числа, хранящегося в стеке
int 21h;
loop A4
mov AH, 02h;
mov DL, 13; перенос курсора вниз на одну строку
int 21h;
mov DL, 10; перенос указателя в начало строки
int 21h;
pop DX;
pop CX; извлечение начальных значений
pop BX; регистров из стека
pop AX;
ret
pbalg8 endp
START:
mov AX,@DATA
mov DS, AX
mov AH, 09h;
mov DX, offset ms0; вывод приветственного сообщения
int 21h;
mov AH, 09h;
mov DX, offset ms1; вывод сообщения о вводе множимого
int 21h;
mov DI, 0; очистка регистра промежуточного результата
INP1:
mov AH, 08h; ожидание ввода символа
int 21h;
cmp AL, 13; сравнение введенного символа с клавишей «Enter»
je EINP1
cmp AL, '-'; сравнение введенного символа с минусом
jne I1
not SI; инвертирование регистра знака SI
mov AH, 02h;
mov DL, AL; вывод минуса на экран
int 21h;
I1:
cmp AL, '0'; сравнение введенного символа с «0»
jb INP1
cmp AL, '9'; сравнение введенного символа с «9»
ja INP1
mov AH, 02h;
mov DL, AL; вывод введенного символа на экран
int 21h;
xor AH, AH; очистка для получения «чистого» числа
sub AX, '0'; получение числа из ASCII кода
mov CX, AX; сохранение введенного числа в регистр CX
mov BX, 10; установка множителя в «10»
mov AX, DI; установка множимого в значение промежуточного; числа
mul BX; выполнение умножения
add AX, CX; добавление введенного числа к промежуточному; числу
mov DI, AX; сохранение промежуточного числа в регистре DI
jmp INP1
EINP1:
mov AH, 09h;
mov DX, offset sb1a; вывод сообщения о выводе множимого в 2-ой СС
int 21h;
mov AX, DI;
call binpr; вывод множимого в двоичной системе счисления
push AX; сохранение множимого в стек
mov AH, 09h;
mov DX, offset sb2; вывод сообщения о вводе множителя
int 21h;
mov DI, 0; очистка регистра промежуточного результата
INP2:
mov AH, 08h; ожидание ввода символа
int 21h;
cmp AL, 13; сравнение введенного символа с клавишей «Enter»
je EINP2
cmp AL, '-'; сравнение введенного символа с минусом
jne I1
not SI; инвертирование регистра знака SI
mov AH, 02h;
mov DL, AL; вывод минуса на экран
int 21h;
I2:
cmp AL, '0'; сравнение введенного символа с «0»
jb INP2
cmp AL, '9'; сравнение введенного символа с «9»
ja INP2
mov AH, 02h;
mov DL, AL; вывод введенного символа на экран
int 21h;
xor AH, AH; очистка для получения «чистого» числа
sub AX, '0'; получение числа из ASCII кода
mov CX, AX;
mov BX, 10;
mov AX, DI; выполнение сдвига промежуточного десятичного
mul BX; числа влево на 1 разряд и добавление в нему
add AX, CX; к нему введенного числа
mov DI, AX;
jmp INP2
EINP2:
mov AH, 09h;
mov DX, offset ms2a; вывод сообщения о выводе множителя в 2-ой СС
int 21h;
mov AX, DI;
call binpr; вывод множителя в двоичной системе счисления
mov BX, DI; перенос множителя в BX
mov AH, 09h;
mov DX, offset ms3; вывод сообщения о начале решения
int 21h;
pop AX; извлечение множимого из стека в регистр AX
mov DX, 0; очистка регистра промежуточного результата
mov CX, 8; установка счетчика циклов
M0:
shl DX, 1; сдвиг частичного произведения влево на 1 разряд
push AX; сохранение значения регистра AX в стек
mov AX, DX;
mov DI, '<'; установка знака операции
call pbalg; вывод частичного произведения на экран
pop AX; восстановление значения регистра AX
shl BX, 1; сдвиг значения множителя влево на 1 разряд
cmp BH, 1; анализ старшего разряда множителя
jne M0A
push AX;
mov DI, '+'; вывод на экран значения слагаемого со знаком
call pbalg8; операции
pop AX;
add DX, AX; добавление множимого к частичному произведению
M0A:
xor BH, BH; очистка проанализированного разряда множителя
push AX;
mov AX, DX;
mov DI, '='; вывод значения частичного произведения на экран
call pbalg;
pop AX;
loop M0
push DX; сохранение результата в стек
mov AX, 0;
mov AH, 09h; вывод сообщения о результате
mov DX, offset sme;
int 21h;
cmp SI, 0; анализ знакового регистра
je NM
mov AH, 02h;
mov DL, '-'; вывод знака «-» на экран
int 21h;
NM:
pop AX; извлечение результата из стека
mov CX, 0; сброс счетчика циклов
R1:
mov DX, 0;
mov BX, 10; получение кода значения текущего разряда
div BX; результата в десятичной системе счисления
add DX, '0';
push DX; сохранение кода остатка результата
inc CX; увеличение счетчика цикла на «1»
cmp AX, 0; анализ частного результата
jne E1
R2:
pop DX; извлечение кода разряда результата из стека
mov AH, 02h; вывод числа
int 21h; на экран
dec CX; уменьшение счетчика циклов на «1»
cmp CX, 0; анализ значения счетчика циклов
jne E2
mov AX, 4c00h; завершение работы
int 21h; программы
end start.
Приложение Б
PROGRAM FOR MULTIPLACTION NUMBERS
Enter the first number (A) (0−127):115
|A| = 0,1 110 011
Enter the second number (B) (0−127):103
|B| = 0,1 100 111
Vychisleniya:
<0
=0
<0
+ 1 110 011
=1 110 011
<11 100 110
+ 1 110 011
=101 011 001
<1 010 110 010
=1 010 110 010
<10 101 100 100
=10 101 100 100
<101 011 001 000
+ 1 110 011
=101 100 111 011
<1 011 001 110 110
+ 1 110 011
=1 011 011 101 001
<10 110 111 010 010
+ 1 110 011
=10 111 001 000 101
The result is 11 845
PROGRAM FOR MULTIPLACTION NUMBERS
Enter the first number (A) (0−127): — 115
|A| = 0,1 110 011
Enter the second number (B) (0−127):103
|B| = 0,1 100 111
Vychisleniya:
<0
=0
<0
+ 1 110 011
=1 110 011
<11 100 110
+ 1 110 011
=101 011 001
<1 010 110 010
=1 010 110 010
<10 101 100 100
=10 101 100 100
<101 011 001 000
+ 1 110 011
=101 100 111 011
<1 011 001 110 110
+ 1 110 011
=1 011 011 101 001
<10 110 111 010 010
+ 1 110 011
=10 111 001 000 101
The result is -11 845
PROGRAM FOR MULTIPLACTION NUMBERS
Enter the first number (A) (0−127):115
|A| = 0,1 110 011
Enter the second number (B) (0−127): — 103
|B| = 0,1 100 111
Vychisleniya:
<0
=0
<0
+ 1 110 011
=1 110 011
<11 100 110
+ 1 110 011
=101 011 001
<1 010 110 010
=1 010 110 010
<10 101 100 100
=10 101 100 100
<101 011 001 000
+ 1 110 011
=101 100 111 011
<1 011 001 110 110
+ 1 110 011
=1 011 011 101 001
<10 110 111 010 010
+ 1 110 011
=10 111 001 000 101
The result is -11 845
PROGRAM FOR MULTIPLACTION NUMBERS
Enter the first number (A) (0−127): — 115
|A| = 0,1 110 011
Enter the second number (B) (0−127): — 103
|B| = 0,1 100 111
Vychisleniya:
<0
=0
<0
+ 1 110 011
=1 110 011
<11 100 110
+ 1 110 011
=101 011 001
<1 010 110 010
=1 010 110 010
<10 101 100 100
=10 101 100 100
<101 011 001 000
+ 1 110 011
=101 100 111 011
<1 011 001 110 110
+ 1 110 011
=1 011 011 101 001
<10 110 111 010 010
+ 1 110 011
=10 111 001 000 101
The result is 11 845
программа умножение assembler произведение