Главная страница

Аисд лаб 8. Отчет защищен с оценкой преподаватель асс


Скачать 80.55 Kb.
НазваниеОтчет защищен с оценкой преподаватель асс
АнкорАисд лаб 8
Дата17.01.2022
Размер80.55 Kb.
Формат файлаdocx
Имя файлаLaboratornaya_rabota_1.docx
ТипОтчет
#333778
страница2 из 2
1   2
SUMMA.


(a + x)*b + (a + y)*b= (-0.1994 + 0.2100)*0.10 + (-0.1994 + 0.2200)*0.10 = 0.0106*0.10 + 0.0206*0.10 = 0,106+ 0,00206= 0.00312

Часть 3.

Для данной части лабораторной работы мне потребовалось составить блок-схему.


format ELF
section '.text' executable

public _main

_main:

;write your code here

mov ax,3; вношу в регистр переменную для проверки а=3

mov bx,4; вношу в регистр переменную для проверки b=4

mov cx,5; вношу в регистр переменную для проверки c=5

cmp ax,bx; сравниваю переменные "a" и "b"

jg next_a; если a>b, то перехожу к указанной метке для последующего сравнения

jl next_b; если b>a, то перехожу к указанной метке для последующего сравнения

cmp cx,ax; сравниваю переменные "c" и "а"

jg next_c; если с>a, то перехожу к указанной метке для последующего сравнения

je points_equal; если с=а, перехожу к указанной метке

next_a:cmp ax,cx; сравниваю переменные "а" и "с"

jg answer_a; если а>c, то перехожу к указанной метке

je points_equal; если а=с, перехожу к указанной метке

next_b: cmp bx,cx; сравниваю переменные "b" и "с"

jg answer_b; если b>c, то перехожу к указанной метке

je points_equal; если b=c, то перехожу к указанной метке

next_c:cmp cx,bx; сравниваю переменные "c" и "b"

jg answer_c; если с>b, то перехожу к указанной метке

je points_equal; если с=b, то перехожу к указанной метке

answer_a: ; переношу в регистр для макс.значения "ах" значение "а"

ret;

answer_b: mov ax,bx; переношу в регистр для макс.значения "ах" значение "b"

ret;

answer_c:mov ax,cx; переношу в регистр для макс.значения "ах" значение "c"

points_equal:; задача не имеет решения, так как имеется 2 и более переменных с макс. значением

;ответ к данной задаче ссответствует числу в регистре "ах" =5

xor eax,eax

ret
Ответ к данной задаче лежит в регистре «ax» и равен 5.

Способ решения:

  • Сначала я внёс переменные, соответствующие произвольным числам, в регистры – в «ax» переменнуюа, в «bx» - b, «cx» - с. Переменная a = 3, b = 4, c = 5.




  • Далее я сравниваю переменные aиb, если a>b, то я «перепрыгиваю» к метке next_a, где я сравниваю переменные а и с, если а>с, то я «перепрыгиваю» к метке answer_a, где моя программа заканчивается и в регистр «ax»записывается ответ. Если окажется, что переменные а и с равны, то мы «перепрыгиваем» нас к метке points_equal, что означает, что программа не выдаст какая из переменных a,b или с больше, так как имеется 2 или более переменных с макс. значением. Если окажется, что а<с, то нас перекидывает к next_c для сравнения переменной с и b, возможны 2 варианта в таком случае: переменная с>bи мы «перепрыгиваем» к метке answer_с, где моя программа заканчивается и в регистр «ax» записывается ответ, или может оказаться, что c=b и тогда мы «перепрыгиваем» метке points_equal, что означает, что программа не выдаст какая из переменных a,b или с больше, так как имеется 2 или более переменных с макс. значением.




  • Если всё жеизначально, ещё при первом действии, окажется, что a<b, то мы «перепрыгиваем» к метке next_b, где программа сравнивает уже переменные b и c и если b>c, то мы «перепрыгиваем» к метке answer_b, где моя программа заканчивается и в регистр «ax» записывается ответ. Ecли переменные b и c окажутся равны, то моя программа «перекидывает» нас к метке points_equal, что означает, что программа не выдаст какая из переменных a,b или с больше, так как имеется 2 или более переменных с макс. значением. Если окажется, что b<c, то программа дальше проходит, где сравнивает ещё раз b и cи после переносит нас к метке answer_с, где программа заканчивается и в регистр «ax»записывается ответ.



Часть 4.

Для данной части лабораторной работы мне потребовалось составить блок-схему.



format ELF
section '.text' executable

public _main

_main:

;write your code here

mov ebp,esp

;выражение N!/(N-K)!

mov edx,0xA; в качестве проверки присваиваем переменной N=10

mov eax,0x1; вносим в регистр число "1" для начала цикла

mov ebx,0x2; вносим в регистр число "2" для начала цикла

sub edx,0x1;

mov ecx,edx; в регистр "eax" вносим число необходимое для повторения цикла

next_N:

mul ebx

add ebx,0x1

loop next_N; повтор цикла

mov esi,eax; переносим ответ на выражение N! в регистр "esi"

mov edx,0xA; вносим переменную N=10

mov eax,0x4; в качестве проверки присваиваем переменной K=4

sub edx,eax; (N-K)

sub edx,0x1; высчитываем число необходимое для проверки цикла

mov ecx,edx; в регистр "ecx" вносим число необходимое для повторения цикла

mov eax,0x1; вносим в регистр число "1" для начала цикла

mov ebx,0x2; вносим в регистр число "2" для начала цикла

next_K:

mul ebx

add ebx,0x1

loop next_K; повтор цикла

mov edi,eax; переносим ответ на выражение (N-K)! в регистр "еdi"

mov eax,esi; переносим значение переменной N! в регистр "eax" для деления

div edi; N!/(N-K)!

;ответ к задаче находится в регистре "eax" = 5040

xor eax,eax

ret
Ответ к данной задаче лежит в регистре «eax» и равен 5040.

Способ решения:

  • Сначала я решил найти N! для моего выражения N!/(NK)!. Для этого в регистр «edx» я внёс переменную N и присвоил ей число для проверки равное N = 10. Присвоил регистру «eax» = 1 и регистру «ebx» = 2 для того, чтобы начать цикл с первых двух чисел факториала. Чтобы внести в регистр «ecx» число необходимое для количества повторения цикла, я вычел из регистра «edx» единицу (так как я начал факториал не с единицы, а с единицы и двойки, мне необходимо сделать на одно повторение меньше) и перенёс получившееся число в регистр «ecx».




  • Начинаем первый цикл с умножения регистров «eax» на «ebx». После чего мы прибавляем к числу в регистре «ebx» единицу (так как факториал подразумевает умножение 1*2*3*…*N) и перемещаем получившееся в регистр «eax», так как умножение с помощью команды mulмы можем умножать только значение регистра «eax» на значение любого другого регистра, в моём случае – «ebx». Так цикл повторяется количество раз равное записанному нами числу в регистре«есх».Ответ запишется в регистр «eax».


N! = 1*2*3*…* 10 = 3628800


  • После выполнения цикла мы перемещаем число из регистра «еах» в регистр «esi»на временное хранение.




  • Далее находим (NK)! по такому же принципу. Снова заношу в регистр «edx» переменную N = 10, но также теперь заносим в регистр «еах» переменную K = 4 (произвольное число) и вычитаем из переменной Nпеременную K. В итоге мы получим число, факториал которого нам необходимо будет найти.


(N – K) = (10 – 4) = 6


  • Далее я снова присвоил регистру «eax» = 1 (число, соотвествующее переменной K в данном регистре нам больше не нужно, поэтому мы можем использовать его для других чисел) и регистру «ebx» = 2 для того, чтобы начать цикл с первых двух чисел факториала. Чтобы внести в регистр «ecx» число необходимое для количества повторения цикла, я вычел из регистра «edx» единицу (так как я начал факториал не с единицы, а с единицы и двойки, мне необходимо сделать на одно повторение меньше) и перенёс получившееся число в регистр «ecx».




  • Начинаем второй цикл с умножения регистров «eax» на «ebx». После чего мы прибавляем к числу в регистре «ebx» единицу (так как факториал подразумевает умножение 1*2*3*…*N) и перемещаем получившееся в регистр «eax», так как умножение с помощью команды mul мы можем умножать только значение регистра «eax» на значение любого другого регистра, в моём случае – «ebx». Так цикл повторяется количество раз равное записанному нами числу в регистре«есх».


(N – K)! = 1*2*3*…*6 = 720


  • Перемещаем значение из регистра «eax»в регистр «edi», для освобождения регистра «eax»и перемещаем в него значение из регистра «esi», так как деление командой div возможно только из этого регистра.



  • Последним действием я делю значение регистра «eax»на значение регистра «edi », т.е. я делаю действие N!/(NK)!. Ответ на данное выражение будет находится в регистре «eax».


N!/(N – K)! = 3628800/720 = 5040

Трассировка для данной программы( Часть 4.)


Адрес (ip)

eax

ebx

ecx

edx

esi

edi

39B

0

0

0

10

0

0

3A0

1

0

0

10

0

0

3A5

1

2

0

10

0

0

3A8

1

2

0

9

0

0

3AA

1

2

9

9

0

0

3AC

2

2

9

0

0

0

3AF

2

3

9

0

0

0

3AA

2

3

8

0

0

0

3AC

6

3

8

0

0

0

3AF

6

4

8

0

0

0

3AA

6

4

7

0

0

0

3AC

24

4

7

0

0

0

3AF

24

5

7

0

0

0

3AA

24

5

6

0

0

0

3AC

120

5

6

0

0

0

3AF

120

6

6

0

0

0

3AA

120

6

5

0

0

0

3AC

720

6

5

0

0

0

3AF

720

7

5

0

0

0

3AA

720

7

4

0

0

0

3AC

5040

7

4

0

0

0

3AF

5040

8

4

0

0

0

3AA

5040

8

3

0

0

0

3AC

40320

8

3

0

0

0

3AF

40320

9

3

0

0

0

3AA

40320

9

2

0

0

0

3AC

362880

9

2

0

0

0

3AF

362880

10

2

0

0

0

3AA

362880

10

1

0

0

0

3AC

3628800

10

1

0

0

0

3AF

3628800

11

1

0

0

0

3B1

3628800

11

0

0

0

0

3B3

3628800

11

0

0

3628800

0

3B8

3628800

11

0

11

3628800

0

3BD

4

11

0

10

3628800

0

3BF

4

11

0

6

3628800

0

3C2

4

11

0

5

3628800

0

3C4

4

11

5

5

3628800

0

3C9

1

11

5

5

3628800

0

3CE

1

2

5

5

3628800

0

3D0

2

2

5

0

3628800

0

3D3

2

3

5

0

3628800

0

3CE

2

3

4

0

3628800

0

3D0

6

3

4

0

3628800

0

3D3

6

4

4

0

3628800

0

3CE

6

4

3

0

3628800

0

3D0

24

4

3

0

3628800

0

3D3

24

5

3

0

3628800

0

3CE

24

5

2

0

3628800

0

3D0

120

5

2

0

3628800

0

3D3

120

6

2

0

3628800

0

3CE

120

6

1

0

3628800

0

3D0

720

6

1

0

3628800

0

3D3

720

7

1

0

3628800

0

3D5

720

7

0

0

3628800

0

3D7

720

7

0

0

3628800

720

3D9

3628800

7

0

0

3628800

720

3DB

5040

7

0

0

3628800

720

3DD

0

7

0

0

3628800

720

Конец

Вывод

Часть 1.

Я решил поставленную задачу на микропроцессоре Intel 8088. Записал описание способа решения, последовательность команд и содержимое регистров после выполнения программы, представленные в двоичном виде. Все данные имеют размер WORD и храниться в РОН (регистрах общего назначения).Программа берёт исходные данные из регистров процессора и там же сохраняет результат. Все мои решения в программе совпадают с решениями, высчитанными вручную, которые также присутствуют в отчёте. Ответ на мою задачу получился 112010 = 100011000002
Часть 2.

Я решил поставленную задачу на сопроцессоре x87. В отчёте содержаться формула для решения задачи, описание способа решения и последовательности инструкций для сопроцессора. Все данные представлены в формате коротких вещественных чисел (Real4). Программа берёт исходные данные из памяти и там же сохраняет результат. Я указал какие регистры используются для ввода и вывода данных.Все мои решения в программе совпадают с решениями, высчитанными вручную, которые также присутствуют в отчёте. Ответ в моей программе получился 0.00312
Часть 3.

Я решил поставленную задачу на микропроцессоре Intel 8088. В отчёте содержаться описание способа решения (в т.ч. графическое – блок-схема) и последовательность команд. Все данные имеют размер WORD и храниться в РОН (регистрах общего назначения). Результатом работы является число, являющееся максимальным из трёх переменных a,bи с.Программа берёт исходные данные из регистров процессора и там же сохраняет результат. Я указал какие регистры используются для ввода и вывода данных.Ответ в моей программе получился 5.
Часть 4.

Я решил поставленную задачу на микропроцессоре Intel 8088. В отчёте содержаться описание способа решения (в т.ч. графическое – блок-схема), последовательность команд и таблицу трассировки для тестовых значений. Все данные имеют размер WORD и храниться в РОН (регистрах общего назначения).Все мои решения в программе совпадают с решениями, высчитанными вручную, которые также присутствуют в отчёте.Ответ в моей программе получился 5040.

Список используемых источников:

  • https://www wikipedia.org/

  • https://www youtube.com/

  • Нортон П., Соухэ Д. – Язык ассемблера для IBMPC – 1992.

  • https://www.draw.io/
1   2


написать администратору сайта