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

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


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

ГУАП

КАФЕДРА 54

ОТЧЕТ
ЗАЩИЩЕН С ОЦЕНКОЙ


ПРЕПОДАВАТЕЛЬ

асс










П.С. Санкин

должность, уч. степень, звание




подпись, дата




инициалы, фамилия




ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ

ВЫПОЛНЕНИЕ РАЗЛИЧНЫХ ОПЕРАЦИЙ

НА ЯЗЫКЕ ASSEMBLER

по курсу: Информатика







РАБОТУ ВЫПОЛНИЛ

СТУДЕНТ ГР.

5643










Л.А. Ольховой










подпись, дата




инициалы, фамилия


Санкт-Петербург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


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