Отчёт 4 (Лабораторная работа №4)
Описание файла
Файл "Отчёт 4" внутри архива находится в папке "Лабораторная работа №4". PDF-файл из архива "Лабораторная работа №4", который расположен в категории "". Всё это находится в предмете "ассемблер" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве МАИ. Не смотря на прямую связь этого архива с МАИ, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "ассемблер" в общих файлах.
Просмотр PDF-файла онлайн
Текст из PDF
Ф ЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮМ ОСКОВСКИЙ АВИАЦИОННЫЙ ИНСТИТУТ(государственный технический университет)Кафедра 304(вычислительные машины, системы и сети)Лабораторная работа по курсу«Ассемблер»Отчёт по работе№4 .Нелинейное программирование на языке Assembler(наименование работы)Вариант задания№2 .Лабораторную работу выполнили:студенты гр. 13-501, Резвяков Денис Михайлович,(должность)(Ф. И. О.)Коршунов Евгений Владимирович.Лабораторную работу принял:доцент каф. 304, к.т.н. Алещенко Алла Степановна(должность)(Ф. И. О.)« 1 ».(подпись)декабря(дата приёма)2009 г.Цель работы: Закрепить навыки программирование блочнойструктуры программы на Ассемблере и сборку программыиспользуя программный пакет TASM.ЗаданиеРазработать программу в Турбо-ассемблере для реализациициклического процесса в соответствии с заданием, выполненным в лабораторной работе №2.Блок-схемаБлок-схема главной процедуры программы:–2–Блок-схема процедуры реализации циклического процесса:Блок-схема процедуры вывода целого числа в консольпредставлена в отчёте по лабораторной работе №3.–3–Код программы реализации нелинейного процессаsseg segment stackdb 64 dup (?)sseg ends;dseg segmentstr_result db "f(x) = result", 10, 13, " -----------", 10, 13, "$"str_bgndb "f($"str_mdldb ") = $"str_enddb 10, 13, "$"value_a dw -6value_b dw 4value_c dw 8value_d dw 2x_from dw -2x_todw 5dseg ends;cseg segmentassume cs:cseg, ds:dseg, ss:sseg;; Процедура вычисления и вывода результата функции;для набора значений X из промежутка [x_from, x_to].; Процедура ломает AX, BX, CX, DX.foreach proc nearmov cx, x_to; Занесение в регистр CX конца промежутка значений Xinc cx; Увеличение CX на 1 для преобразования счётчика в Xpush bp; Сохранение старого локального смещения стекаpush cx; Сохранение значения для смещения начала отсчётаmov bp, sp; Установка локального смещения стека из текущегоsub cx, x_from ; Вычитание из CX начального X - кол-во шагов циклаfe_bgn: leamovintmovsubpushpushcallleamovintmovpopcmpjljedx, str_bgnah, 921hax, [ss:bp]ax, cxcxaxoutintdx, str_mdlah, 921hax, value_abxbx, 0fe_negfe_zro;;;;;;;;;;;;;;;;Помещаем в регистр DX адрес строки-префиксаПомещаем в регистр AH код операции вывода строкиВызываем прерывание для вывода строки на экранСчитываем значение смещения начала отсчётаВычитаем текущий шаг и получаем текущий XКладём CX (счётчик шагов цикла) в стекКладём AX (текущее значение X) в стекВыводим текущее значение числа X (в регистре AX)Помещаем в регистр DX адрес строки-разделителяПомещаем в регистр AH код операции вывода строкиВызываем прерывание для вывода строки на экранКладём в регистр AX значение A (для любого случая)Восстанавливаем значение X из стека в регистр BXСравниваем текущий X (в BX) с нулёмЕсли X меньше нуля, переходим на метку...Если X равен нулю, переходим на метку...–4–fe_pos: imul ax; X положительный.
Умнажаем AX само на себяsub ax, bx; Вычитаем X (в BX): (DX,AX) = (DX,AX) - BXsbb dx, 0; Продолжаем вычитание для DX (A^2 - (0:X))mov cx, value_c ; Кладём значение C в регистр CXadd cx, value_d ; Прибавляем к C (в CX) значение D - C+Didiv cx; Получаем результат: AX = DX:AX / СXjmp fe_nxt; Переходим на вывод результатаfe_zro: sub ax, value_b ; X равен нулю. Вычитаем: AX=A-B, в регистре AXcwd; Расширяем слово до двойного слова DX:AX = A-Bidiv value_d; Получаем результат: AX = DX:AX / Djmp fe_nxt; Переходим на вывод результатаfe_neg: mov cx, 2; X отрицательный.
Помещаем в регистр CX число 2imul cx; Умножаем AX на 2: (DX:AX) = 2*Aimul bx; Умножаем AX на BX: (DX:AX) = 2*A*Xadd ax, 5; Получаем результат: AX = 2*A*X + 5fe_nxt: call outint; Выводим текущий результат от переменной X (в AX)lea dx, str_end ; Помещаем в регистр DX адрес кодов для новой строкиmov ah, 9; Помещаем в регистр AH код операции вывода строкиint 21h; Вызываем прерывание для вывода строки на экранpop cx; Восстанавливаем значение счётчика цикла из стекаloop fe_bgn; Продолжение цикла или его окончаниеpop cx; Забираем из стека смещение начала отсчётаpop bp; Восстанавливаем исходного локального смещения стекаretforeach endp;; Процедура вывода числа, хранящегося в AX.; Процедура ломает AX, BX, CX, DX.outint proc nearxor bx, bx ; Обнуляем BX - это будет признак отрицательного числаmov cx, 10 ; В CX заносим число 10 - основание десятичной системыpush bx; Заносим нуль в стек - это признак конца строкиcmp ax, 0; Сравниваем выводимое число с нулёмjnl oi_get ; ...если не отрицательное, то переходим к вычислениямinc bl; Устанавливаем признак отрицательного числаneg ax; Само число делаем положительнымoi_get: xor dx, dx ; Обнуляем регистр DX перед делением, т.к.
AX >= 0idiv cx; Делим (DX,AX) на CX, т.е. на 10ordl, 30h ; Преобразуем цифру в код символа, добавляя код 30hpush dx; Заносим очередной символ в стекcmp ax, 0; Сравниваем результат деления с нулёмjne oi_get ; ...если результат не нуль, то продолжаем делить; Текст числа получен, выводим его на экранmov ah, 6; Заносим код 6 для команды вывода символа на экранcmp bl, 0; Сравниваем признак отрицательного числа с нулёмjeoi_put ; ...если признака нет, то переходим к выводу числаmov dx, '-' ; Помещаем код символа минус в регистрoi_nxt: int 21h; Вызываем обработку команды 6 - вывода символаoi_put: pop dx; Вытаскиваем очередной код символа из стекаcmp dx, 0; Сравниваем символ с признаком конца строки - с нулёмjne oi_nxt ; ...если символ не нулевой, то продолжаем циклretoutint endp–5–start procpushpushmovmovfardsaxbx, dsegds, bxlea dx, str_result ; Эквивалент - "mov dx, offset str_result"mov ah, 9int 21hcall foreachretstart endp;cseg endsend startРезультат работы программыf(x) = result----------f(-2) = 29f(-1) = 17f(0) = -5f(1) = 3f(2) = 3f(3) = 3f(4) = 3f(5) = 3–6–.