Отчёт 2 (Лабораторная работа №2)
Описание файла
Файл "Отчёт 2" внутри архива находится в папке "Лабораторная работа №2". PDF-файл из архива "Лабораторная работа №2", который расположен в категории "". Всё это находится в предмете "ассемблер" из 9 семестр (1 семестр магистратуры), которые можно найти в файловом архиве МАИ. Не смотря на прямую связь этого архива с МАИ, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "ассемблер" в общих файлах.
Просмотр PDF-файла онлайн
Текст из PDF
Ф ЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮМ ОСКОВСКИЙ АВИАЦИОННЫЙ ИНСТИТУТ(государственный технический университет)Кафедра 304(вычислительные машины, системы и сети)Лабораторная работа по курсу«Ассемблер»Отчёт по работе№2 .Команды передачи управления и организации циклов(наименование работы)на языке программирования AssemblerВариант задания№2 .Лабораторную работу выполнили:студенты гр. 13-501, Резвяков Денис, Коршунов Евгений(должность).(Ф.
И. О.)Лабораторную работу принял:зам. декана фак. №3, Алещенко Алла Степановна(должность)(Ф. И. О.)« 10 ».(подпись)ноября(дата приёма)2009 г.Цель работы: Освоить нелинейное программированиес использованием условных и безусловных команд перехода,а также команд организации циклов.ЗаданиеРазработать программу реализации циклического процессавычисления выражения:25,,6;4;8;2;2,0;0;,0.5.При этом деление используется целочисленное.Код программы реализации нелинейного процессаprogram Laba2;vara, b, c, d, xa, xb, x: integer;r_asm, r_pas : array [0..10] of integer;labelstart, next, positive, zero, negative;begina := -6;b :=4;c :=8;d :=2;xa := -2;xb := 5;for x := xa to xb doifx < 0 then r_pas[x - xa] := 2*a*x + 5else if x > 0 then r_pas[x - xa] := (a*a - x) div (c + d)elser_pas[x - xa] := (a - b) div d;WriteLn;Write('x:');for x := xa to xb doWrite(x:5);Write('-');WriteLn;Write('pascal:');for x := 0 to xb - xa + 1 doWrite(r_pas[x]:5);–2–asmmovpushmovsubincmovincAX,AXCX,CX,CXAX,AXpush AXOFFSET r_asm {кладём адрес начала результирующего массива в AX}{сохраняем адрес результирующего массива в стеке (в BP-4)}xb {кладём конец промежутка X в регистр CX}xa {вычитаем из конца промежутка начало промежутка}{прибавляем к CX единицу для получения кол-ва проходов цикла}xb {кладём конец промежутка X в регистр AX}{добавляем к AX единицу и получаем смещение начала отсчёта...}{...относительно счётчика шагов цикла}{сохраняем смещение начала отсчёта в стеке (в BP-6)}start:mov BX, [BP-6] {копируем из стека значение смещения начала отсчёта в стеке}sub BX, CX {вычитаем из смещения текущий шаг цикла и получаем текущий X}jb negative {если результат вычитания (т.е.
X) < 0, то переходим по метке}je zero{если результат вычитания равен нулю, то переходим по метке}{результат вычитания больше нуля, выполняем код ниже}positive:mov AX, a {помещаем в регистр AX значение переменной A}imul AX{умножаем значение регистра AX само на себя}sub AX, BX {вычитаем из произведения текущее значение X (в регистре BX)}sbb DX, 0 {продолжаем вычитание (DX:AX) - (0:BX)}mov BX, c {помещаем в регистр BX значение переменной C}add BX, d {прибавляем к значению регистра BX значение переменной D}idiv BX{получаем результат в регистре AX: AX = (DX:AX) / BX}jmp next{безусловно переходим по метке сохранения результата и далее}zero:mov AX, a {помещаем в регистр AX значение переменной A}sub AX, b {вычитаем из значения регистра AX значение переменной B}cwd{расширяем слово AX до двойного слова DX:AX}idiv d{получаем результат в регистре AX: AX = DX:AX / D}jmp next{безусловно переходим по метке сохранения результата и далее}negative:mov AX, a {помещаем в регистр AX значение переменной A}imul BX{умножаем значение регистра AX на X (в BX): (DX:AX) = AX * BX}mov BX, 2 {помещаем в регистр BX число 2}imul BX{умножаем значение регистра AX на 2 (в BX): (DX:AX) = AX * BX}add AX, 5 {получаем результат в регистре AX: AX = AX + 5}next:movmovaddmovloopend;BX, [BP-4][BX], AXBX, 2[BP-4], BXstart{копируем из стека адрес результирующего массива}{копируем текущий результат по текущему адресу в массиве}{сдвигаем указатель (адрес) массива на одно слово}{копируем в стек сдвинутый адрес результирующего массива}{если обработаны не все шаги цикла, то переходим по метке}WriteLn;Write('asm:');for x := 0 to xb - xa + 1 doWrite(r_asm[x]:5);ReadLn;end.Результат работы программыx:pascal:asm:-22929-117170-5-5133233333433–3–53300.