Реализация алгоритма на языке программирования Assembler




Введение

 

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

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

 


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

 

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

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

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

 

  0,101 ×   ,      
         
+        
         
       
+        
         
       
+        
         
       
+        
         

 


Реализация алгоритма на языке программирования 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 заполняются пробелами, что позволяет смоделировать ситуацию выполнения операции сложения множимого и младших разрядов частичного произведения при выводе на экран.

Текст разработанной программы на языке Ассемблер представлен в приложении А.

 

Анализ результатов

 

Для тестирования программы были использованы следующие исходные данные:

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;

) Конспект лекций по дисциплине «Организация ЭВМ и систем»;

) Конспект лекций по дисциплине «Ассемблер».

 


Приложение А

 

Листинг программы.

model small200hdb 'PROGRAM FOR MULTIPLACTION NUMBERS', '$';db?, 13,10,'Enter the first number (A) (0-127):', '$'; строкиa db?, 13,10,'|A| = 0,', '$'; дляdb?, 13,10,'Enter the second number (B) (0-127):', '$'; выводаa db?, 13,10,'|B| = 0,', '$'; наdb?, 13,10,'Vychisleniya:', 13,10,'$'; экранdb?, 13,10,'The result is ', '$';proc; начало процедуры PRINTBIN 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;AX; 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;M4AH, 02h; 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;DX, DI; 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;A4AH, 02h; DL, 13; перенос курсора вниз на одну строку

int 21h;

mov DL, 10; перенос указателя в начало строки

int 21h;

pop DX;

pop CX; извлечение начальных значений

pop BX; регистров из стека

pop AX;

retendp:AX,@DATADS, AXAH, 09h; DX, offset ms0; вывод приветственного сообщения

int 21h;AH, 09h; 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 INP1AH, 02h; 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:AH, 09h; DX, offset sb1a; вывод сообщения о выводе множимого в 2-ой СС

int 21h;AX, DI; 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 INP2AH, 02h; DL, AL; вывод введенного символа на экран

int 21h;

xor AH, AH; очистка для получения «чистого» числа

sub AX, '0'; получение числа из ASCII кода

mov CX, AX;BX, 10; AX, DI; выполнение сдвига промежуточного десятичного

mul BX; числа влево на 1 разряд и добавление в нему

add AX, CX; к нему введенного числа

mov DI, AX;INP2:AH, 09h; DX, offset ms2a; вывод сообщения о выводе множителя в 2-ой СС

int 21h; 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; операцииAX; DX, AX; добавление множимого к частичному произведению

M0A:

xor BH, BH; очистка проанализированного разряда множителя

push AX;AX, DX; DI, '='; вывод значения частичного произведения на экран

call pbalg;AX; M0

push DX; сохранение результата в стек

mov AX, 0;

mov AH, 09h; вывод сообщения о результате

mov DX, offset sme;21h; 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; программыstart.

 


Приложение Б

FOR MULTIPLACTION NUMBERSthe first number (A) (0-127):115

|A| = 0,1110011the second number (B) (0-127):103

|B| = 0,1100111:

<0000000000000000

=0000000000000000

<0000000000000000

+ 01110011

=0000000001110011

<0000000011100110

+ 01110011

=0000000101011001

<0000001010110010

=0000001010110010

<0000010101100100

=0000010101100100

<0000101011001000

+ 01110011

=0000101100111011

<0001011001110110

+ 01110011

=0001011011101001

<0010110111010010

+ 01110011

=0010111001000101 result is 11845

PROGRAM FOR MULTIPLACTION NUMBERSthe first number (A) (0-127): - 115

|A| = 0,1110011the second number (B) (0-127):103

|B| = 0,1100111:

<0000000000000000

=0000000000000000

<0000000000000000

+ 01110011

=0000000001110011

<0000000011100110

+ 01110011

=0000000101011001

<0000001010110010

=0000001010110010

<0000010101100100

=0000010101100100

<0000101011001000

+ 01110011

=0000101100111011

<0001011001110110

+ 01110011

=0001011011101001

<0010110111010010

+ 01110011

=0010111001000101 result is -11845

PROGRAM FOR MULTIPLACTION NUMBERSthe first number (A) (0-127):115

|A| = 0,1110011the second number (B) (0-127): - 103

|B| = 0,1100111:

<0000000000000000

=0000000000000000

<0000000000000000

+ 01110011

=0000000001110011

<0000000011100110

+ 01110011

=0000000101011001

<0000001010110010

=0000001010110010

<0000010101100100

=0000010101100100

<0000101011001000

+ 01110011

=0000101100111011

<0001011001110110

+ 01110011

=0001011011101001

<0010110111010010

+ 01110011

=0010111001000101 result is -11845

PROGRAM FOR MULTIPLACTION NUMBERSthe first number (A) (0-127): - 115

|A| = 0,1110011the second number (B) (0-127): - 103

|B| = 0,1100111:

<0000000000000000

=0000000000000000

<0000000000000000

+ 01110011

=0000000001110011

<0000000011100110

+ 01110011

=0000000101011001

<0000001010110010

=0000001010110010

<0000010101100100

=0000010101100100

<0000101011001000

+ 01110011

=0000101100111011

<0001011001110110

+ 01110011

=0001011011101001

<0010110111010010

+ 01110011

=0010111001000101 result is 11845

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



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-03-31 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: