Аисд лаб 8. Отчет защищен с оценкой преподаватель асс
Скачать 80.55 Kb.
|
1 2 ГУАП КАФЕДРА № 54 ОТЧЕТ ЗАЩИЩЕН С ОЦЕНКОЙ ПРЕПОДАВАТЕЛЬ
РАБОТУ ВЫПОЛНИЛ
Санкт-Петербург2015 Цель работы Целью работы является изучение представления чисел в памяти ЭВМ и базовых принципов написания программ (последовательное выполнение команд, ветвление, циклы). Изучение проводится на примере команд пересылки данных, арифметических команд, команд условных переходов и команд сопроцессора x87 микропроцессора Intel 8088. Часть первая: Решить поставленную задачу на микропроцессоре Intel 8088. В отчёте должны содержаться описание способа решения, последовательность команд и содержимое регистров после выполнения программы, представленные в двоичном виде. Все данные должны иметь размер WORD и храниться в РОН (регистрах общего назначения). Часть вторая: Решить поставленную задачу на сопроцессоре x87. В отчёте должны содержаться формула для решения задачи, описание способа решения и последовательности инструкций для сопроцессора. Все данные должны быть представлены в формате коротких вещественных чисел (Real4). Часть третья: Решить поставленную задачу на микропроцессоре Intel 8088. В отчёте должны содержаться описание способа решения (в т.ч. графическое) и последовательность команд. Все данные должны иметь размер WORD и храниться в РОН (регистрах общего назначения). Результатом работы должно стать значение 0 (ложь) или 1 (истина), сохранённое в регистре AX, если в условиях задачи не указано обратное. Часть четвёртая: Решить поставленную задачу на микропроцессоре Intel 8088. В отчёте должны содержаться описание способа решения (в т.ч. графическое), последовательность команд и таблицу трассировки для тестовых значений. Все данные должны иметь размер WORD и храниться в РОН (регистрах общего назначения). Постановка задачи Часть 1. Целочисленные вычисления (Вариант №4) Каждая задача предполагает написание линейно выполняемой программы. Программа берёт исходные данные из регистров процессора и там жесохраняет результат. В отчёте нужно указать какие регистры используются для ввода и вывода данных. Вычислите значение выражения f(x,y) c коэффициентами A,B, где A – месяц вашего рождения минус год вашего рождения, B – число вашего рождения. Вид функции выбирается в соответствии с порядковым списком в группе. Например, для человека с номером в журнале группы 17 и датой рождения 14.06.1998 выражение будет иметь вид(-1992-x)*14 – (-1992-y)/14. Во всех выражениях используется целочисленное деление, остаток от деления отбрасывается. Часть 2. Вычисления с плавающей точкой (Вариант №4) Каждая задача предполагает написание линейно выполняемой программы. Программа берёт исходные данные из памяти и там же сохраняет результат. Для хранения данных требуется использовать 32-битные значения в формате IEEE 754. Индивидуальное задание берется из первой части. Часть 3. Оператор ветвления (Вариант №4) Каждая задача предполагает написание линейно выполняемой программы. Программа берёт исходные данные из регистров процессора и там же сохраняет результат. В отчёте нужно указать, какие регистры используются для ввода и вывода данных. Перед выполнением работы необходимо самостоятельно выбрать регистры, в которых будут хранится входные и выходные данные. Часть 4. Задачи на перебор и циклические вычисления (Вариант №4) Задание Часть 1.(Вариант №4) 4. (A+x)*B + (A+y)*B Часть 2. (Вариант №4) 4. (A+x)*B + (A+y)*B Часть 3. (Вариант №4) 4. Найти максимальное из трёх чисел a, b и c Часть 3. (Вариант №4) 4. Вычислить число перестановок из N по K Описание метода реализации Часть 1. format ELF section 'Ольховой Леонид. Лабораторная работа №1. Часть 1. 14 вариант' executable public _main _main: mov ebp, esp; for correct debugging ;f(x,y)=(-1994+x)*10+(-1994+y)*10 mov ax,0xF836; A=-1994 mov bx,0x7d0;вношу в регистр значение для проверки х=2000 add ax,bx; (A+x) mov cx,0xA; B=10 imul ax,cx; (A+x)*B mov si,ax mov ax,0xf836; A=-1994 mov bx,0x7D0;вношу в регистр значение для проверки y=2100 add ax,bx mul cx; add ax,si;(A+x)*B+(A+x)*B ret; В ответе получается число 112010, в двоичном коде равное 100011000002, записанное в регистре «ax». Cпособ решения: первым делом я решил сложить переменную А = -1946 (значение которой вычел по условию задания (4-1998=-1994)), которую внес в регистр «ax» и переменную х= 2000 (я решил взять это число для проверки моей программы), внесённую мною в регистр «bx». После чего в регистр «cx» я ввожу переменную B= 10 (значение которой я взял из условия задачи) и делю содержимое регистра «ax» на «cx». Ответ данного действия записался в регистр «ax». Но для того, чтобы совершать последующие действия, мне потребуются операции, связанные с регистром «ax», поэтому число из регистра «ax» я перемещаю в регистр «si». (A + x)*В =( -1994+2000)*10 = 6*10 = 60 Далее я снова ввожу в регистр «ax» число -1994, так как переменная А мне снова потребуется, а в регистр «bx» я ввожу переменную y= 2100 (я решил взять это число для проверки моей программы) и складываю их. Так как в регистр «cx» я не заносил никакого другого числа, там до сих пор находится переменная B, которую я умножаю на сумму переменных (A + y), записанную в регистре «ax». Ответ записывается в регистр «ax». (A + x)*В =( -1994+2100)*10 = 106*10= 1060 И последним действием я складываю регистры «ax», в котором у меня хранится число 6, полученное после выполнения выражения (A + x)*В, и «si», в котором у меня хранится число 1060, полученное после выполнения выражения (A + y)*B. Ответ сохраняется в регистре «ax». (A + x)*B + (A + y)*B = ( -1994+2000)*10 + ( -1994+2100)*10 = 6*10+ 106*10 = 60 + 1060 = 112010 = 100011000002 Часть 2. %include "io.inc" section .text global CMAIN CMAIN: mov ebp,esp fld dword [a]; вносим в стек переменную [a]=-0,1994 fld dword [x]; вносим в стек переменную для проверки [x]=0,2100 fadd ; (a+x) fld dword [b]; вношу в стек переменную [b]=0,10 fmul ; (a+x)*b fst dword [t]; значение (a+x)*b выносим из стека в память под переменной [t] fld dword [a]; вносим в стек переменную [a]=-0,1994 fld dword [y]; вносим в стек переменную для проверки [y]=0,2200 fadd ; (a+y) fld dword [b]; вношу в стек переменнуб [b]=0,10 fmul ; (a+y)*b fld dword [t]; вношу в стек переменную [t]=(a+x)*b fadd ; (a+x)*b+(a+y)*b fst dword [SUMMA]; значение (a+x)*b+(a+y)*b выносим из стека в память ;под переменной [SUMMA] ;ответ к данной задаче содержится под переменной "Summa"=0.00312 xor eax,eax ret section .data a dd -0.1994 b dd 0.10 x dd 0.2100 y dd 0.2200 t dd 0 SUMMA dd 0 Ответ на данную задачу будет храниться в памяти под переменной SUMMA и равен будет = 0.00312. Способ решения: Изначально я ввожу в память переменные a = -0.1994(значение которой я взял из первой части лабораторной работы и добавил к ней плавающую точку в произвольной месте), b = 0.10 (значение которой я также взял из первой части лабораторной работы и добавил к ней плавающую точку в произвольной месте), x = 0.2100 (я взял это число для проверки моей программы),y = 0.2200 (я взял это число для проверки моей программы), t = 0 (данная переменная потребуется для хранения половины всего выражения)и переменную SUMMA = 0 (в данной переменной будет содержаться ответ на выражение ( (a + x)*b + (a + y)*b ) ). Далее я внёс в стек переменные a = -0.1994 и переменную x = 0.2100 и сложил их. После чего, не вынося число получившееся при (a + x),я вношу в стек переменную b = 0.10 и умножаю (a + x) на b. (a + x)*b = (-0.1994 + 0.2100)*0.10 = 0.0106*0.10= 0,106 Число, получившееся при (a +x)*b, я выношу из стека под переменной t, для того, чтобы в стеке можно было делать последующие вычисления с другими числами. Я снова вношу в стек переменную a = -0.1994 и переменную y = 0.2200 и складываю их. После чего, не вынося из стека число получившееся при (a + y), я вношу в стек переменную b = 0.18 и умножаю (a + y) на b. (a + y)*b = (-0.1994 + 0.2200)*0.10 = 0.0206*0.10 = 0,00206 Последним действием я вношу обратно в стек переменную t, которой присвоено значение (a + x)*b, и складываю её с до сих пор находящимся в стеке числом, полученном при (a + y)*b, а ответ после сложения, являющимся ответом на всё выражение, я выношу из стека и сохраняю в памяти под переменной 1 2 |