Отчёт #4 (Примеры лаб и отчётов)
Описание файла
Файл "Отчёт #4" внутри архива находится в следующих папках: Примеры лаб и отчётов, Отчёты. PDF-файл из архива "Примеры лаб и отчётов", который расположен в категории "". Всё это находится в предмете "ассемблер" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве МАИ. Не смотря на прямую связь этого архива с МАИ, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "ассемблер" в общих файлах.
Просмотр PDF-файла онлайн
Текст из PDF
Ф ЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮМ ОСКОВСКИЙ АВИАЦИОННЫЙ ИНСТИТУТ(государственный технический университет)Кафедра 304(вычислительные машины, системы и сети)Лабораторная работа по курсу«Ассемблер»Отчёт по работе№4 .Нелинейное программирование на языке Assembler(наименование работы)Вариант задания№2 .Лабораторную работу выполнили:студенты гр.
13-501, Резвяков Денис, Коршунов Евгений(должность).(Ф. И. О.)Лабораторную работу принял:зам. декана фак. №3, Алещенко Алла Степановна(должность)(Ф. И. О.)« 10 ».(подпись)ноября(дата приёма)2009 г.Цель работы: Закрепить навыки программирование блочнойструктуры программы на Ассемблере и сборку программыиспользуя программный пакет TASM.ЗаданиеРазработать программу в Турбо-ассемблере для реализациициклического процесса в соответствии с заданием, выполненным в лабораторной работе №2.Код программы реализации нелинейного процесса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–2–;; Процедура вычисления и вывода результата функции;для набора значений 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: leamovintmovsubpushpushcallleamovintmovpopcmpjljefe_pos: imulsubsbbmovaddidivjmpfe_zro: subcwdidivjmpfe_neg: movimulimuladdfe_nxt: callleamovintpoplooppoppopretforeach endpdx, str_bgnah, 921hax, [ss:bp]ax, cxcxaxoutintdx, str_mdlah, 921hax, value_abxbx, 0fe_negfe_zroaxax, bxdx, 0cx, value_ccx, value_dcxfe_nxtax, value_b;;;;;;;;;;;;;;;;;;;;;;;;;value_d;fe_nxt;cx, 2;cx;bx;ax, 5;outint;dx, str_end ;ah, 9;21h;cx;fe_bgn;cx;bp;Помещаем в регистр DX адрес строки-префиксаПомещаем в регистр AH код операции вывода строкиВызываем прерывание для вывода строки на экранСчитываем значение смещения начала отсчётаВычитаем текущий шаг и получаем текущий XКладём CX (счётчик шагов цикла) в стекКладём AX (текущее значение X) в стекВыводим текущее значение числа X (в регистре AX)Помещаем в регистр DX адрес строки-разделителяПомещаем в регистр AH код операции вывода строкиВызываем прерывание для вывода строки на экранКладём в регистр AX значение A (для любого случая)Восстанавливаем значение X из стека в регистр BXСравниваем текущий X (в BX) с нулёмЕсли X меньше нуля, переходим на метку...Если X равен нулю, переходим на метку...X положительный.
Умнажаем AX само на себяВычитаем X (в BX): (DX,AX) = (DX,AX) - BXПродолжаем вычитание для DX (A^2 - (0:X))Кладём значение C в регистр CXПрибавляем к C (в CX) значение D - C+DПолучаем результат: AX = DX:AX / СXПереходим на вывод результатаX равен нулю. Вычитаем: AX=A-B, в регистре AXРасширяем слово до двойного слова DX:AX = A-BПолучаем результат: AX = DX:AX / DПереходим на вывод результатаX отрицательный. Помещаем в регистр CX число 2Умножаем AX на 2: (DX:AX) = 2*AУмножаем AX на BX: (DX:AX) = 2*A*XПолучаем результат: AX = 2*A*X + 5Выводим текущий результат от переменной X (в AX)Помещаем в регистр DX адрес кодов для новой строкиПомещаем в регистр AH код операции вывода строкиВызываем прерывание для вывода строки на экранВосстанавливаем значение счётчика цикла из стекаПродолжение цикла или его окончаниеЗабираем из стека смещение начала отсчётаВосстанавливаем исходного локального смещения стека–3–outintoi_get:oi_nxt:oi_put:oi_out:outintstart;; Процедура вывода числа, хранящегося в AX.; Процедура ломает AX, BX, CX, DX.proc nearxor bx, bx ; Обнуляем BX - это будет признак отрицательного числаmov cx, 10 ; В CX заносим число 10 - основание десятичной системыpush bx; Заносим нуль в стек - это признак конца строкиcmp ax, 0; Сравниваем выводимое число с нулёмjnl oi_get ; ...если не отрицательное, то переходим к вычислениямinc bl; Устанавливаем признак отрицательного числаneg ax; Само число делаем положительным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, '-' ; Помещаем код символа минус в регистрint 21h; Вызываем обработку команды 6 - вывода символаpop dx; Вытаскиваем очередной код символа из стекаcmp dx, 0; Сравниваем символ с признаком конца строки - с нулёмjne oi_nxt ; ...если символ не нулевой, то продолжаем циклretendp;proc farpush dspush axmov bx, dsegmov ds, 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–4–.