Аисд лаб 8. Отчет защищен с оценкой преподаватель асс
Скачать 80.55 Kb.
|
1 2 (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!/(N – K)!. Для этого в регистр «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»на временное хранение. Далее находим (N– K)! по такому же принципу. Снова заношу в регистр «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!/(N – K)!. Ответ на данное выражение будет находится в регистре «eax». N!/(N – K)! = 3628800/720 = 5040 Трассировка для данной программы( Часть 4.)
Вывод Часть 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 |