Отчет 4 (565159)
Текст из файла
Ф ЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮМ ОСКОВСКИЙ АВИАЦИОННЫЙ ИНСТИТУТ(государственный технический университет)Кафедра 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–.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.