Материал: Larin_Anton_OEVM_21_3

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра МО ЭВМ

отчет

по лабораторной работе №2

по дисциплине «Организация ЭВМ и систем»

Тема: Представление и обработка целых чисел. Организация ветвящихся процессов

Студент гр. 8383

Ларин Антон

Преподаватель

Санкт-Петербург

2019

Цель работы.

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

Основные теоретические положения.

Обычно в программе есть точки, в которых нужно принять решение о том, какая команда будет выполняться следующей. Это решение может быть

  • безусловным — в данной точке необходимо передать управление не той команде, которая идет следующей, а другой, которая находится на некотором удалении от текущей команды;

  • условным — решение о том, какая команда будет выполняться следующей, принимается на основе анализа некоторых условий или данных.

CMP

Данная команда ассемблера сравнивает содержимое двух полей данных.

Фактически команда CMP вычитает второй операнд из первого, но содержимое полей  не изменяет.  Операнды должны иметь одинаковую длину: байт или слово. Команда CMP может сравнивать  содержимое  регистра,  памяти или непосредственное значение  с  содержимым  регистра; или    содержимое регистра или непосредственное значение с содержимым памяти.

Команда воздействует на такие флаги процессора как AF, CF, OF, PF, SF и ZF.

Безусловные переходы

Предыдущее обсуждение выявило некоторые детали механизма перехода. Команды перехода модифицируют регистр указателя команды eip/ip и, возможно, сегментный регистр кода cs. Что именно должно подвергнуться модификации, зависит:

  • от типа операнда в команде безусловного перехода (ближний или дальний);

  • от указания перед адресом перехода (в команде перехода) модификатора; при этом сам адрес перехода может находиться либо непосредственно в команде (прямой переход), либо в регистре или ячейке памяти (косвенный переход).

Модификатор может принимать следующие значения:

  • near ptr — прямой переход на метку внутри текущего сегмента кода. Модифицируется только регистр eip/ip (в зависимости от заданного типа сегмента кода use16 или use32) на основе указанного в команде адреса (метки) или выражения, использующего символ извлечения значения СчА — $;

  • far ptr — прямой переход на метку в другом сегменте кода. Адрес перехода задается в виде непосредственного операнда или адреса (метки) и состоит из 16-битного селектора и 16/32-битного смещения, которые загружаются, соответственно, в регистры cs и ip/eip;

  • word ptr — косвенный переход на метку внутри текущего сегмента кода. Модифицируется (значением смещения из памяти по указанному в команде адресу, или из регистра) только eip/ip. Размер смещения 16 или 32 бит;

  • dword ptr — косвенный переход на метку в другом сегменте кода. Модифицируются (значением из памяти — и только из памяти, из регистра нельзя) оба регистра, cs и eip/ip. Первое слово/двойное слово этого адреса представляет смещение и загружается в ip/eip; второе/третье слово загружается в cs.

Команда безусловного перехода jmp

Синтаксис команды безусловного перехода jmp [модификатор] адрес_перехода - безусловный переход без сохранения информации о точке возврата.

Адрес_перехода представляет собой адрес в виде метки либо адрес области памяти, в которой находится указатель перехода.

Всего в системе команд микропроцессора есть несколько кодов машинных команд безусловного перехода jmp. Их различия определяются дальностью перехода и способом задания целевого адреса. Дальность перехода определяется местоположением операнда адрес_перехода. Этот адрес может находиться в текущем сегменте кода или в некотором другом сегменте. В первом случае переход называется внутрисегментным, или близким, во втором — межсегментным, или дальним. Внутрисегментный переход предполагает, что изменяется только содержимое регистра eip/ip. Можно выделить три варианта внутрисегментного использования команды jmp:

  • прямой короткий;

  • прямой;

  • косвенный.

Условные переходы

Микропроцессор имеет 18 команд условного перехода. Эти команды позволяют проверить:

  • отношение между операндами со знаком (“больше — меньше”);

  • отношение между операндами без знака (“выше — ниже”)2;

  • состояния арифметических флагов zf, sf, cf, of, pf (но не af).

Команды условного перехода имеют одинаковый синтаксис: jcc метка_перехода

Как видно из табл. 1, мнемокод всех команд начинается с “j” — от слова jump (прыжок), cc — определяет конкретное условие, анализируемое командой. Что касается операнда метка_перехода, то эта метка может находится только в пределах текущего сегмента кода, межсегментная передача управления в условных переходах не допускается. В связи с этим отпадает вопрос о модификаторе, который присутствовал в синтаксисе команд безусловного перехода.

Таблица 1. Перечень команд условного перехода для команды cmp

Типы операндов

Мнемокод команды условного перехода

Критерий условного перехода

Значения флагов для осществления перехода

Любые 

je 

операнд_1 = операнд_2 

zf = 1 

Любые 

jne 

Операнд_1<>

операнд_2 

zf = 0 

Со знаком 

jl/jnge 

операнд_1 < операнд_2 

sf <> of

Со знаком 

jle/jng 

операнд_1 <= операнд_2 

sf <> of or zf = 1 

Со знаком 

jg/jnle 

операнд_1 > операнд_2 

sf = of and zf = 0

Со знаком 

jge/jnl 

операнд_1 => операнд_2 

sf = of 

Без знака 

jb/jnae 

операнд_1 < операнд_2 

cf = 1 

Без знака 

jbe/jna 

операнд_1 <= операнд_2 

cf = 1 or zf=1 

Без знака 

ja/jnbe 

операнд_1 > операнд_2 

cf = 0 and zf = 0 

Без знака 

jae/jnb 

операнд_1 => операнд_2 

cf = 0 

Задание

Разработать на языке Ассемблера программу, которая по заданным целочисленным значениям параметров a, b, i, k вычисляет:

а) значения функций i1 = f1(a,b,i) и i2 = f2(a,b,i);

b) значения результирующей функции res = f3(i1,i2,k),

где вид функций f1 и f2 определяется из табл. 2, а функции f3 - из табл.3 по цифрам шифра индивидуального задания (n1,n2,n3), приведенным в табл.4.

Значения a, b, i, k являются исходными данными, которые должны выбираться студентом самостоятельно и задаваться в процессе исполнения программы в режиме отладки. При этом следует рассмотреть всевозможные комбинации параметров a, b и k, позволяющие проверить различные маршруты выполнения программы, а также различные знаки параметров a и b.

Таблица 2

Таблица 3

/ 15-2*i , при a>b

f1 = <

\ 3*i+4 , при a<=b

/ - (4*i+3) , при a>b

f2 = <

\ 6*i -10 , при a<=b

/ 7 - 4*i , при a>b

f3 = <

\ 8 -6*i , при a<=b

/ -(6*i - 4) , при a>b

f4 = <

\ 3*(i+2) , при a<=b

/ 20 - 4*i , при a>b

f5 = <

\ -(6*I - 6), при a<=b

/ 2*(i+1) -4 , при a>b

f6 = <

\ 5 - 3*(i+1), при a<=b

/ -(4*i -5) , при a>b

f7 = <

\ 10 - 3*i , при a<=b

/ - (6*i+8) , при a>b

f8 = <

\ 9 -3*(i-1), при a<=b

/ min(i1,i2), при k=0

f1 = <

\ max(i1,i2), при k/=0

/ max(i1,10-i2), при k<0

f2 = <

\ |i1 - i2| , при k>=0

/ |i1 + i2|, при k=0

f3 = <

\ min(i1,i2), при k/=0

/ min (|i1 - i2|, 2), при k<0

f4 = <

\ max( -6, -i2), при k>=0

/ min(|i1|, 6), при k=0

f5 = <

\ |i1|+|i2|, при k/=0

/ |i1 - i2|, при k<0

f6 = <

\ max(7, |i2|), при k>=0

/ |i1| + |i2|, при k<0

f7 = <

\ max(6, |i1|), при k>=0

/ |i1| - |i2|, при k<0

f8 = <

\ max(4,|i2|-3), при k>=0

Таблица 4

№ студента

Шифр задания

№ студента

Шифр задания

1

2

3

4

5

6

7

8

9

10

11

12

13

1.2.1

1.3.2

1.4.3

1.5.4

1.6.5

1.7.6

1.8.7

2.3.8

2.4.7

2.5.6

2.6.5

2.7.4

2.8.3

14

15

16

17

18

19

20

21

22

23

24

25

26

3.4.2

3.5.3

3.6.4

3.7.5

3.8.6

4.5.7

4.6.8

4.7.2

4.8.3

5.6.4

5.7.5

5.8.6

6.8.1

Замечания:

  1. при разработке программы нельзя использовать фрагменты, представленные на ЯВУ, в частности, для ввода-вывода данных. Исходные данные должны вводиться, а результаты контролироваться в режиме отладки;

  2. при вычислении функций f1 и f2 вместо операции умножения следует использовать арифметический сдвиг и, возможно, сложение;

  3. при вычислении функций f1 и f2 нельзя использовать процедуры;

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

Источник: https://studfile.net/preview/15919957/