Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Лабораторная работа 14

Работа добавлена на сайт samzan.net: 2016-06-09

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 21.5.2024

Лабораторная работа №1.  

ВСТРОЕННЫЙ АССЕМБЛЕР

Ассемблером называется машинно-зависимый компилятор, преобразующий специальным образом составленные текстовые строки в машинные инструкции. Как и любой другой компилятор, ассемблер упрощает разработку программ за счет того, что предоставляет пользователю доступ к кодам машинных инструкций и операндам с помощью символьных имен. Встроенный ассемблер имеется в версиях 6.0 и 7.0 Турбо Паскаля и в руках опытного программиста представляет собой мощный инструмент, позволяющий «выжать» из ПК все возможное.

1.1. ОБЩЕЕ ОПИСАНИЕ МП 8086/8088

Встроенный ассемблер (далее - просто ассемблер) дает возможность программировать на уровне отдельных машинных инструкций. Это - главное отличие ассемблера от Паскаля и в этом отличии сосредоточены все его достоинства и недостатки. Достоинство заключается в том, что, программируя на ассемблере, программист обычно выбирает последовательность машинных инструкций так, чтобы реализовать нужные вычисления с максимальной скоростью при минимальных затратах памяти, в то время как даже такой весьма совершенный компилятор, как компилятор Турбо Паскаля неизбежно вносит в машинный код некоторую избыточность, уменьшающую скорость счета и увеличивающую затраты памяти. С другой стороны, программирование на уровне машинных инструкций - чрезвычайно хлопотное занятие и не может сравниться по скорости разработки программ с программированием на Паскале - в этом заключается главный недостаток ассемблера.

Чтобы использовать средства ассемблера, необходимо ясно представлять себе детали архитектуры микропроцессоров Intel 80x86.

1.2. Регистры

В МП 8086/8088 имеется 14 регистров. В функциональном отношении они делятся на группы:

регистры общего назначения (АХ, ВХ, СХ, DX); предназначены для хранения операндов и выполнения основных команд; любой из них может использоваться как совокупность двух независящих друг от друга 8-разрядных регистров: старшего байта регистра (АН, ВН, СH, DH) и младшего байта (AL, BL, CL, DL); например, АХ состоит из АН и AL;

сегментные регистры (CS, DS, SS, ES); используются для указания сегмента при адресации памяти;

регистры-указатели (SP, BP, IP); используются для указания смещения при адресации памяти;

индексные регистры (SI, DI); применяются для индексной адресации;

 регистр флагов; используется для хранения признаков состояния процессора.

Внутри одной и той же функциональной группы регистры используются различным образом. Ниже описывается специфика использования регистров.

Регистр АХ. Является основным сумматором. Используется во всех арифметических операциях (сложить, умножить и т.п.). Только с помощью АХ и его полурегистров AH и AL возможен обмен данными с портами ввода/вывода.

Регистр ВХ. Используется как сумматор в арифметических операциях, а также как базовый регистр при индексной адресации.

Регистр СХ. В основном используется как счетчик при выполнении операций повторения и сдвига. Может также участвовать в арифметических операциях.

Регистр DX. Используется как регистр данных в операциях ввода/вывода, а также как сумматор при обработке длинных целых чисел (32-разрядных).

ОБЗОР ПРИЕМОВ ПРОГРАММИРОВАНИЯ НА АССЕМБЛЕРЕ

1.1. Программирование арифметических выражений.        

Программа на языке Ассемблер состоит из операторов (команд) . Каждый оператор занимает одну строку. Общий вид оператора:

<оператор>  <операнд1>,<операнд2>

Некоторые операторы могут содержать только один из операндов.

Пример наиболее часто встречающейся команды:

Mov ax,x

Команда копирует содержимое переменной (операнда) x в регистр процессора ax. Соответствует команде в языке Паскаль:

Ax:=x;

Операторы языка Ассемблер не допускают использования двух переменных в качестве операндов для команды, т. е. команда

mov x,y   { в Паскале x:=y}

где x и y – переменные, недопустима. Следует писать:

mov ax,x

mov y,ax

В данном курсе  рассмотрена арифметика для целых двоичных чисел. В табл. 1  представлены основные команды для выполнения арифметических операции, а в  табл. 2 —  дополни тельные .    

Таблица 1 Двоичная арифметика.

Обозначения, используемые в таблице :

on 1, on 2, on — операнды, т.е. содержимое, стоящее по первому (оп 1), второму (оп 2) адресам или единственный операнд (on); al, ah, ax, dx, eax, edx — регистры, причем eax, edx допустимы только для процессоров 80386 и выше.

Как видно из табл. 1, в командах умножения и деления задается один операнд, второй сомножитель или делимое в фиксированных регистрах. Команда умножения возвращает результат в два раза длиннее сомножителей, команда деления требует, чтобы делимое было в два раза длиннее делителя. Результатом выполнения команды деления являются частное (регистр, записанный первым в таблице) и остаток (регистр, записанный вторым).

Если перед кодом стоит буква i (imul, idiv, i-integer-целый), операции выполняются с учетом знаков исходных данных, в противном случае — беззнаковые операции.

ПРИМЕР: Вычислить значение выражения x=y+(z-u*v)/w, если исходные данные занимают одно слово.

Program asm_prg;

Var

X,y,z,u,v,w:integer;

Begin

Writeln(‘ Writeln  y,z,u,v,w’);

Readln (y,z,u,v,w);  { это комментарий}

Asm                      { Здесь начинается ассемблерный     код}

mov ax,v       {   ax:=v}

mul u             {   ax:=ax*u}

mov bx,ax     (bx:=ax)

mov ax,z        (ax:=z)

sub ax,bx       (ax:=ax-bx)

cwd                 {подготовка к делению}

Idiv w              (ax:=ax div w)

add ax,y          (ax:=ax+y)

mov x,ax         (x:=ax)

End;                       { Здесь заканчиваетсяассемблерный  код}

Writeln (‘x=  ‘,x);

Readln;

End.

"Узелки" на память

Данные, участвующие в операциях, должны быть одной длины (байт-байт, слово-слово, двойное слово - двойное слово).

Команда умножения изменяет содержимое регистра dx (edx) даже если сомножители дают произведение, которое помещается в ах (еах).

Команда деления требует дополнительной подготовки, т.е. увеличения длины делимого(длина делимого должна быть в 2 раза больше длины делителя). Для расширения делимого в ah, dx, eaх (для байта, слова и двойного слова соответственно) записывается знаковый разряд.

Рекомендуем просмотреть выполнение программы с помощью отладчика!

Таблица 2 Двоичная арифметика(дополнительные команды)

Заметим, что команды inc(dec) используются вместо add(sub), если нельзя менять флаг переноса; команды adc(sbb) используются для вычислений с многократной точностью

Задание. Написать программу на языке Паскаль с использованием Ассемблерной вставки для произведения вычислений.

  1.  y=4x+2
  2.  y=y*x+x/2
  3.  y=(x+y)/(x-y)
  4.  x;=x/2+y-2*x)
  5.  x:=3y-(x-2*y)
  6.  x:=x/y-(y-2*x)/2


Лабораторная работа №2.

2. Организация разветвлений.

Для организации разветвлений используются команды условных и безусловных переходов. Команды условного перехода имеют ограниченную область доступа -128..127 байт, т. е. разность между адресом очередной команды и адресом перехода должна быть в этом диапазоне.

Если необходимо перейти к команде вне области действия команды перехода, команда условного перехода комбинируется с командой безусловного перехода.

ПРИМЕР: Реализовать на ассемблере оператор

------------------------            

        if ( х < 3 ) then x:=x+1;

         x:=x-1;

-------------------------

Решение 1

-------------------------

mov ax,x             ;ax:=x

cmp ax,3             ; сравнить x и  3

jge    @metka       ;перейти на строчку metka если x>=3

      inc ax            ; ax::=ax+1

@metka:    dec ax                  ; ax::=ax-1

-------------------------

 Здесь metka - метка  строки вне области действия оператора if.

Заметим, что команды inc(dec) используются вместо add(sub).

ПРИМЕР: Реализовать на ассемблере оператор

 if ( х < 3 ) goto mrtka

Предложенное  выше решение НЕ ВЕРНО, транслятор сообщит об ошибке, если metka вне области действия оператора if.

Решение 2

-------------------------

mov   ах,х  ; х=>ах

сmр   ах, 3  ; сравнить x и  3

jge     @continue ; if (x>=3) goto continue

jmp    near ptr @metka ; if (x<3) goto m

    @continue:..

-------------------------

Решение ВЕРНО. Здесь используется команда безусловного перехода с префиксом near ptr. Префикс определяет область действия команды безусловного перехода и принимает значения:

short      область действия-128..127 байт

 near ptr область действия -32768..32767 байт

far ptr    область действия распространяется на другие модули программы.

При использовании команд перехода необходимо правильно выбирать требуемые команды с учетом работы со знаковыми и беззнаковыми данными.

Таблица 3 Основные команды условного перехода .

Знаковые данные

Беззнаковые данные

Не зависят от типа

jl (jnge) - меньше

jb (jnal) - ниже

je (jz) - paвно

jg (jnle) - больше

ja (jnbe) - выше

jne (jnz) - нe равно

jle (jng) - нe больше

jbe (jna) - нe выше

jo - переполнение

jge (jnl) - нe меньше

jae (jnb) - нe ниже

jno - нет переполнения

js    отрицательное

jc - перенос

jns    не отрицательное

jnc - нет переноса

Примеры команд с использованием команд перехода.

 ПРИМЕР 1: Вычислить z=max(x,y) с учетом знака чисел х, у

------------------------            

var

    x,y,z:integer;

begin

   read(x,y);

   asm

      mov   ах, х    ; aх: =х

 сmр ах, у          ; х сравнивается с у

  jge    @xgey ;

 mov    ах, у           ; ax: =y

@xgey: mov     z, ах  ; z:=ax

   end;

   writeln(‘max=  ‘,z);

end.

------------------------            

В этом примере xgey — метка с  адресом перехода, если х >= у.

Задание. Написать программу на языке Паскаль с использованием Ассемблерной вставки для произведения вычислений.

  1.  Дано  квадратное уравнение a*x*x +b*x +c=0. Определить есть ли у него действительные корни.
  2.  Если x попадает в интервал (3..7), увеличить его в два раза иначе, уменьшить в два раза.
  3.  Дано  квадратное уравнение a*x*x +b*x +c=0. Определить сколько у него действительных корней.
  4.  Даны три отрезка. Надо выяснит, можно ли из них построить треугольник.
  5.  Даны  три числа. Найти наибольшее из них.   
  6.  Дано двузначное число. Необходимо определить различны ли в нем цифры.
  7.  Дано трехзначное число. Необходимо определить все ли цифры в нем различны.
  8.  Дано четыре отрезка. Необходимо определить можно ли построить из них четырехугольник.
  9.  Дано четыре отрезка. Необходимо определить можно ли построить из них прямоугольный четырехугольник.
  10.   Дано три отрезка. Необходимо определить можно ли из них построить прямоугольный треугольник.
  11.   Даны три числа. Необходимо отсортировать их по возрастанию.

Лабораторная работа №3.

3. Организация циклов.

Для организации циклов с известным числом повторений используется команда loop или ее модификации. Область действия команды и ее модификаций такая же, как у команд условного перехода (-128..127).

Циклический участок программы обычно имеет следующую структуру:

mov   сx, число повторений   { Инициализация цикла}

jcxz    метка_после_цикла

метка:    

           {тело цикла}

loop   метка

метка_после_цикла :

Команда jcxz означает переход при сх=0, т.е. цикл не нужно выполнять ни разу. Напоминаем, что по команде loop содержимое сх уменьшается на 1 и, если сх<>0, то переход к метке, заданной в команде loop, в противном случае — выход из цикла.

Если выход из цикла определяется не только числом повторений, вместо команды loop можно использовать ее разновидности

{ loope }      повтор цикла, если счетчик не исчерпан и флаг

{ loopz }       нуля установлен

{ loopne }    повтор цикла, если счетчик не исчерпан и флаг

{ loopnz }     нуля не установлен

ПРИМЕР: Найти сумму  S=1+2+3+4+…+n.

var

  s,n:integer;

begin

   read(n);

   asm

      mov cx,n

      mov ax,0

      jcxz @end

@for:

           add ax,cx

      loop @for

@end: mov s,ax

    end;

    writeln('s=',s);

readln;

readln;

end.

Та же  программа с использованием для организации цикла «прыжков».

var

  s,n:integer;

begin

   read(n);

   asm

     mov cx,n

     mov ax,0

@for:    jcxz @end

         add ax,cx

         dec cx

     jmp @for

 @end: mov s,ax

    end;

    writeln('s=',s);

readln;

readln;

end.

Пример2. 1. Дано натуральное n. Написать программу вычисления x в  степени n.

var

  x,n:integer;

begin

   read(x,n);

   asm

     mov cx,n

     mov ax,1

    jcxz @end

   @for:

         imul x

    loop @for

@end: mov x,ax

    end;

    writeln('s=',x);

readln;

readln;

end.

Задание. Написать программу на языке Паскаль с использованием Ассемблерной вставки для произведения вычислений.

1. Найти сумму: S=1+2+3+4+…+n

2. Вычислить произведение: S=(n-1)(n-2)(n-3)…(n-(n-1)).

3. Дано целое число n. Найти сумму цифр числа  n.

4. Дано целое n. Сколько цифр в числе n?

5. Наитии  наибольший делитель числа x не считая само число.




1. реферат дисертації на здобуття наукового ступеня кандидата економічних наук Київ ~
2. Организационная культура как фактор развития организации
3. ты~дауы сия~ты
4.  Мне трудно имитировать поведение других людей В н 2
5. Контрольная работа- Физико-географическая и навигационная характеристика арктических морей и Северного морского пути
6. Формирование инновационной стратегии фирмы Четко сформулированная стратегия важна для продвижения новше.html
7. тема знаков препинания
8. тема правил в соответствии с которой действуют люди входящие в организацию
9. по теме- Генетика Общее число задач- 10 001 В метацентрической хромосоме имевшей последовательн
10. В Крыму применили химическое оружие
11. РЕФЕРАТ дисертації на здобуття наукового ступеня кандидата технічних наук Львів ~ Дисерт
12. Активные методы теоритического обучения
13. Место контроллинга в системе управления предприятия 1.html
14. .Наука. Ее эволюция и цели.
15. РЕФЕРАТ дисертації на здобуття наукового ступеня кандидата психологічних наук Київ200.html
16. ПОЕДИНОК Действие повести относится к середине 90х годов XIX века
17. Василек cемейству астровых
18. Причины школьной неуспеваемости
19. На тему- Зарубежный опыт кадрового менеджмента и его применение в России
20. Тема 19. Всемирное хозяйство как экономическая система