Моделирование операции умножения

Составление программы, реализующей моделирование операции умножения, начиная со старших разрядов множителя, при сдвиге суммы частичного произведения влево и неподвижным множителем. Особенности реализации программы на алгоритмическом языке Assembler.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 25.05.2014
Размер файла 26,9 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Моделирование операции умножения

Введение

Основная цель данной курсовой работы заключается в составлении программы, реализующей моделирование операции умножения, начиная со старших разрядов множителя, при сдвиге суммы частичного произведения влево и неподвижным множителем.

В данной работе будет рассмотрен принцип решения задач, основанный на применении заданного алгоритма, а также исследованы особенности реализации программы на алгоритмическом языке Assembler. Для проверки правильности составления алгоритма целевой программы, также будет выполнено тестирование программы со сравнением результатов ручной обработки и полученных с помощью разработанного программного обеспечения.

1. Принцип решения поставленной задачи

В основу разрабатываемого алгоритма программы входит метод умножения, начиная со старших разрядов множителя, при сдвиге суммы частичного произведения влево и неподвижном множимом.

Данный метод заключается в поразрядном анализе множителя, начиная с его старших разрядов, и поочередном выполнении сдвига частичного произведения влево. Исходные числа (множимое и множитель) берутся по модулю. Операция умножения состоит из ряда последовательных операций сложения частичных произведений. Операциями сложения управляют разряды множителя: если в каком-то разряде множителя находится единица, то к сумме частичных произведений добавляется множимое с соответствующим сдвигом (влево или вправо), если в разряде множителя - ноль, то множимое не прибавляется, но учитывается, что в последующей операции анализа разряда множителя надо сделать дополнительный сдвиг. Последний сдвиг частичного произведения не выполняется.

Пример решения задачи.

0,101

Ч

0

,

1

1

1

0000

0000

+

0000

0000

0000

<

0000

0000

+

0101

0000

0101

<

0000

1010

+

0101

0000

1111

<

0001

1110

+

0101

0010

0011

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 = 1110011

B = 103 = 1100111

Для проверки правильности составления программы вычисления были рассмотрены четыре случая:

Первый случай.

A = 115 = 0,1110011

B = 103 = 0,1100111

Второй случай.

- A = -115 = 1,1110011

B = 103 = 0,1100111

Третий случай.

A = 115 = 0,1110011

- B = -103 = 1,1100111

Четвертый случай.

- A = -115 = 1,1110011

- B = -103 = 1,1100111

Так как при решении задачи множимое и множитель берутся по модулю, то для ручной проверки будет рассматриваться только первый случай.

Результат: 0,0101110010001012 = 1184510

Результат выполнения программы для 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,1110011

Enter the second number (B) (0-127):103

|B| = 0,1100111

Vychisleniya:

<0000000000000000

=0000000000000000

<0000000000000000

+ 01110011

=0000000001110011

<0000000011100110

+ 01110011

=0000000101011001

<0000001010110010

=0000001010110010

<0000010101100100

=0000010101100100

<0000101011001000

+ 01110011

=0000101100111011

<0001011001110110

+ 01110011

=0001011011101001

<0010110111010010

+ 01110011

=0010111001000101

The result is 11845

PROGRAM FOR MULTIPLACTION NUMBERS

Enter the first number (A) (0-127): - 115

|A| = 0,1110011

Enter the second number (B) (0-127):103

|B| = 0,1100111

Vychisleniya:

<0000000000000000

=0000000000000000

<0000000000000000

+ 01110011

=0000000001110011

<0000000011100110

+ 01110011

=0000000101011001

<0000001010110010

=0000001010110010

<0000010101100100

=0000010101100100

<0000101011001000

+ 01110011

=0000101100111011

<0001011001110110

+ 01110011

=0001011011101001

<0010110111010010

+ 01110011

=0010111001000101

The result is -11845

PROGRAM FOR MULTIPLACTION NUMBERS

Enter the first number (A) (0-127):115

|A| = 0,1110011

Enter the second number (B) (0-127): - 103

|B| = 0,1100111

Vychisleniya:

<0000000000000000

=0000000000000000

<0000000000000000

+ 01110011

=0000000001110011

<0000000011100110

+ 01110011

=0000000101011001

<0000001010110010

=0000001010110010

<0000010101100100

=0000010101100100

<0000101011001000

+ 01110011

=0000101100111011

<0001011001110110

+ 01110011

=0001011011101001

<0010110111010010

+ 01110011

=0010111001000101

The result is -11845

PROGRAM FOR MULTIPLACTION NUMBERS

Enter the first number (A) (0-127): - 115

|A| = 0,1110011

Enter the second number (B) (0-127): - 103

|B| = 0,1100111

Vychisleniya:

<0000000000000000

=0000000000000000

<0000000000000000

+ 01110011

=0000000001110011

<0000000011100110

+ 01110011

=0000000101011001

<0000001010110010

=0000001010110010

<0000010101100100

=0000010101100100

<0000101011001000

+ 01110011

=0000101100111011

<0001011001110110

+ 01110011

=0001011011101001

<0010110111010010

+ 01110011

=0010111001000101

The result is 11845

программа умножение assembler произведение

Размещено на Allbest.ru


Подобные документы

  • Определение функций выходных сигналов и сигналов возбуждения. Построение функциональной схемы управляющего автомата. Способы выполнения операции умножения с фиксированной и с плавающей запятой. Получение функциональной ГСА. Кодирование состояния автомата.

    курсовая работа [60,9 K], добавлен 15.02.2011

  • Анализ технического задания. Разработка программы по вычислению функции на языке ассемблер для микропроцессора Кр580ВМ80. Алгоритмы программного умножения, деления, сложения, вычитания и сдвига влево многобайтных чисел. Расчет времени работы программы.

    курсовая работа [88,2 K], добавлен 19.09.2012

  • Моделирование движения пешехода и составление блок-схемы программы. Построение изображения выходного сигнала в MathCAD и нормирование переходной характеристики. Модель программы обслуживание покупателей на языке GPSS/PC-2, описание команд и операндов.

    курсовая работа [635,4 K], добавлен 01.02.2014

  • Выполнение операции деления в ЭВМ. Умножение чисел, представленных в форме с плавающей запятой. Методы ускорения операции умножения. Матричный метод умножения. Деление чисел в машинах с плавающей запятой. Деление чисел с восстановлением остатков.

    реферат [49,4 K], добавлен 18.01.2011

  • Разработка алгоритма выполнения операций умножения двоичных чисел в формате расширенной точности на сумматоре обратного кода. Преобразование входной строки в десятичное число. Разработка алгоритма арифметической операции. Тестирование программы-эмулятора.

    курсовая работа [119,1 K], добавлен 24.06.2012

  • Операционный блок микропроцессора, арифметические операции с целыми операндами. Пути увеличения производительности арифметико-логического устройства за счет параллельной обработки различных команд выполняемой программы. Сумматор частичных произведений.

    контрольная работа [56,5 K], добавлен 05.09.2010

  • Особенности разработки программы и выбор методов решения задачи. Составление алгоритма, распределение регистров программы и формирование файлов. Описание процедуры очистки памяти, сложения, вычитания, умножения. Тестирование и листинг программы.

    лабораторная работа [51,2 K], добавлен 14.05.2011

  • Разработка программы, позволяющей проверить знания таблицы умножения у учеников начальных классов. Проектирование программы в среде DEV-C++. Структурная схема программы и ее описание. Контрольный пример и анализ результатов, инструкция пользователя.

    курсовая работа [1,8 M], добавлен 24.06.2015

  • Разработка программы на языке Assembler, отсчитывающую время от заданного значения до 0. Осуществление ввода с помощью стандартной шестнадцатикнопочной терминальной клавиатуры, подключаемой к параллельному порту (P1). Логика построения программы.

    курсовая работа [188,8 K], добавлен 15.08.2009

  • Оценка погрешности и точности в математике. Составление программы и алгоритма для численного дифференцирования с заданной допустимой погрешностью на алгоритмическом языке Turbo Pascal 7.0. Составление алгоритма и программы аппроксимации функции.

    курсовая работа [810,6 K], добавлен 24.03.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.