Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовик.docx
Скачиваний:
1
Добавлен:
21.09.2019
Размер:
531.2 Кб
Скачать

Дамп памяти, для проверки результата:

H Dump

T 000 0000 400C 001B 0C00 1E00 0046 0C00 3A28

T 010 0043 3800 3330 0033 4800 4900 0008 0000

T 020 0D00 003A 1C00 400C 003A 0000 3A28 0043

T 030 3400 1800 001E 0C00 3DFF 0000 0200 000D

T 040 0000 0100 0002 0000 07AC 2100 8000 1800

T 050 1E0C 0068 0080 030C 8000 0000 680C 8003

T 060 AC20 1800 6BAC 024C 0000 0D00 0006 0000

T 070 0000 0000 0000 0000 0000 0000 0000 0000

T 080 0000 0000 0000 0000 0000 0000 0000 0000

T 090 0000 0000 0000 0000 0000 0000 0000 0000

T 0A0 0000 0000 0000 0000 0000 0000 0000 0000

T 0B0 0000 0000 0000 0000 0000 0000 0000 0000

T 0C0 0000 0000 0000 0000 0000 0000 0000 0000

T 0D0 0000 0000 0000 0000 0000 0000 0000 0000

T 0E0 0000 0000 0000 0000 0000 0000 0000 0000

T 0F0 0000 0000 0000 0000 0000 0000 0000 0000

E 000

Как мы можем заметить, в переменной res с адресом 03D лежит значение 00000D в хексе, в десятичной это 13, что является 7-мым членом ряда Фибоначчи, в данном коде у нас n = 7, следовательно, программа работает верно.

Выводы по работе:

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

Текст индивидуального задания по варианту:

Найти скалярное произведение двух векторов.

Алгоритм решения на ЯВУ(java):

class asm1 {

int[] vec1 = {1, 2, 3};

int[] vec2 = {1, 2, 3};

public int scalMul() {

int res = 0

for(int i = 0; i < vec1.length; i++)

res += vec1[i]*vec2[i];

return res;

}

}

Схема алгоритма решения задачи: (i – индекс (сдвиг), res – результат)

начало

vec1 = {1, 2, 3}; vec2 = {4, 5, 6}; i = 0

нет

да

i < 9

конец

res = vec1[i]*vec2[i] i = i+3;

Текст программы на языке ассемблера:

use16

org 100h

;

mov cx,3

xor si,si

xor dx,dx

cycle_:

mov ax,[vec1+si]

mul [vec2+si]

add si,2

add [res],ax

loop cycle_

mov ax,[res]

;

mov ax,4C00h

int 21h

;

vec1 dw 1,2,3

vec2 dw 4,5,6

res dw 0

Результат перед завершением сохраняется в регистре ax:

Как мы можем заметить, в регистре ax лежит значение 0020 в хексе, в десятичной это 32, проверим: 1*4+2*5+3*6 = 4+10+18 = 32, следовательно, программа работает верно.

Выводы по работе:

В ходе работы с массивами, можно заметить некоторую особенность обращения к элементам массива: мы указываем адрес на (первый элемент) + (количество байтов, необходимых чтобы добраться в памяти до нужного элемента), это связано с тем, что массив представляет собой последовательность переменных (байтов) стоящих в памяти последовательно.

Текст индивидуального задания по варианту:

Определить n-й член ряда Фибоначчи: F[1]=1, F[2]=1, F[n]=F[n-1]+F[n-2].

Алгоритм решения на ЯВУ(java):

class asm2 {

int f = 1;

int s = 1;

public int fib(int amount) {

if(amount < 2)

return f;

f += s;

f += s;

s = f - s;

f -= s;

return fib(amount-1);

}

}

Спецификации всех разработанных методов:

Метод fe (Fibonacci Element):

Входные данные: задаются неявно (находятся в регистрах)

Алгоритм: прибавляем к значению регистра ax значение регистра dx ,

сохраняем в регистр bx , затем в регистр ax ложем значение регистра dx, а в

регистр dx ложем значение регистра bx.

Выходные данные: отсутствуют (т.к. метод работает с регистрами)

Схема алгоритма решения задачи: (ax, cx, dx - регистры)

начало

mov cx, 5 mov ax, 1 mov dx, 1

да

нет

n > 0

call fe

конец

n--;

Текст программы на языке ассемблера:

use16

org 100h

;

mov ax,1

mov dx,1

mov cx,5

cycle_:

call fe

loop cycle_

nop

;

mov ax,4C00h

int 21h

fe:

add ax,dx

mov bx,ax

mov ax,dx

mov dx,bx

ret

Результат перед завершением сохраняется в регистре dx:

Как мы можем заметить, в регистре dx лежит значение 000D в хексе, в десятичной это 13, что является 7-мым членом ряда Фибоначчи, в данном коде у нас n = 7, следовательно, программа работает верно.

Выводы по работе:

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

ОБЩИЙ ВЫВОД ПО ПРОЕКТУ

В ходе выполнения проекта, мы работали с двумя разновидностями языков ассемблера: учебный язык ассемблера, разработанный на факультете информационных технологий Владимирского Государственного Университета имени Александра Григорьевича и Николая Григорьевича Столетовых и языком ассемблера на базе архитектуры Intel 8086, так же известный как asm x86. Сначала мы пользовались учебным языком ассемблера, где многие аспекты языка были значительно упрощены либо переделаны, но, тем не менее, основная концепция языка сохранилась. В ходе проекта были изучены некоторые аспекты языков ассемблера, и ЭВМ в целом. Ассемблер является символическим аналогом машинного языка. По этой причине программа, написанная на ассемблере, должна отражать все особенности архитектуры микропроцессора: организацию памяти, способы адресации операндов, правила использования регистров и т. д. Из-за необходимости учета подобных особенностей ассемблер уникален для каждого типа микропроцессоров.

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

19