Дамп памяти, для проверки результата:
H
Dump
T
000 0400 3B10 0020 0080 2320 802C 1800 200C
T
010 0020 AC10 1800 35AC 0128 0038 3800 06FF
T
020 0000 2000 0001 0000 0200 0003 0000 0400
T
030 0005 0000 0600 0003 0000 0900 0000 0000
T
040 0000 0000 0000 0000 0000 0000 0000 0000
T
050 0000 0000 0000 0000 0000 0000 0000 0000
T
060 0000 0000 0000 0000 0000 0000 0000 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 с адресом 020 лежит значение 000020 в хексе, в десятичной это 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):
Входные параметры: адрес ТАЗ
Алгоритм: прибавляем к значению первой переменной ТАЗ значение второй,
сохраняем во временную переменную, затем меняем местами значения переменных
и сохраняем нашу временную переменную во вторую переменную ТАЗ.
Выходные данные: отсутствуют (т.к. метод работает с адресами)
Схема алгоритма решения задачи: (n – член ряда который надо найти, fe – подпрограмма, f – первый член ряда, s – второй член ряда, res - результат)
начало
да
нет
n
<= 2
перейти
на метку m2
А
А
метка
m1:
jsub
fe
да
нет
n
> 2
метка
m2:
res
= s
перейти
на метку m1
конец
Текст программы на языке ассемблера:
H Lab2 | Lab2 start 0
T 000 000040 | lda c1
T 003 0C001B | sta f
T 006 0C001E | sta s
T 009 000046 | lda cn
T 00C 0C003A | sta n
T 00F 280043 | comp c2
T 012 380033 | jlt m2
T 015 300033 | jeq m2
T 018 480049 | m1 jsub fe
| ;
T 01B | f resb 3
T 01E | s resb 3
| ;
T 021 00003A | lda n
T 024 1C0040 | sub c1
T 027 0C003A | sta n
T 02A 00003A | lda n
T 02D 280043 | comp c2
T 030 340018 | jgt m1
T 033 00001E | m2 lda s
T 036 0C003D | sta res
T 039 FF | hlt
| ;
T 03A | n resb 3
T 03D | res resb 3
T 040 000001 | c1 word 1
T 043 000002 | c2 word 2
T 046 000007 | cn word 7
| ;
T 049 AC21 | fe rmo l,x
T 04B 008000 | lda 0,x
T 04E 18001E | add 3,x
T 051 0C0068 | sta tmp
T 054 008003 | lda 3,x
T 057 0C8000 | sta 0,x
T 05A 000068 | lda tmp
T 05D 0C8003 | sta 3,x
T 060 AC20 | rmo l,a
T 062 18006B | add c6
T 065 AC02 | rmo a,l
T 067 4C | rsub
| ;
T 068 | tmp resb 3
T 06B 000006 | c6 word 6
| ;
E 000 | end Lab2
2)