МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра МО ЭВМ
отчет
по лабораторной работе №3
по дисциплине «Организация ЭВМ и систем»
Тема: Представление и обработка целых чисел. Организация ветвящихся процессов
|
Студент гр. 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 |
Замечания:
при разработке программы нельзя использовать фрагменты, представленные на ЯВУ, в частности, для ввода-вывода данных. Исходные данные должны вводиться, а результаты контролироваться в режиме отладки;
при вычислении функций f1 и f2 вместо операции умножения следует использовать арифметический сдвиг и, возможно, сложение;
при вычислении функций f1 и f2 нельзя использовать процедуры;
при разработке программы следует минимизировать длину кода, для чего, если надо, следует преобразовать исходные выражения для вычисления функций.
Выполнение
Вариант 13 Шифр задания 2.8.3
/ - (4*i+3) , при a>b
f2 = <
\ 6*i -10 , при a<=b
/ - (6*i+8) , при a>b
f8 = <
\ 9 -3*(i-1), при a<=b
/ |i1 + i2|, при k=0
f3 = <
\ min(i1,i2), при k/=0
Сегменты в программе размещены в порядке:
Стек
Данные
Код
В сегменте данных заданы метки для переменных a, b, i, k, i1, i2, res использующихся в программе.
В связи с запретом на использование процедур в программе, функции были реализованы при помощи фрагментов кода, размеченных метками, с безусловными переходами на них. “Вызов” функции безусловным переходом jmp к метке данной функции. Функции используют значения переменных в сегменте данных, непосредственной передачи аргументов в функцию не происходит. Возврат значения происходит посредством заталкивания результата в стек, и выталкивание оного в переменную в основном фрагменте программы.
Функции содержат ветвление. Их поведение зависит от состояния переменных a, b, следовательно функции f1 и f2 логически подразделяются на три части:
сравнение переменных a и b и две ветви, переход в которые осуществляется непосредственно после сравнения. После расчета значения функции, оно помещается в стек, а управление передается в основной фрагмент кода, по заранее заданной метке.
Исполнение функции f3 происходит аналогичным образом, но использует значения рассчитанные в двух предыдущих функциях
Тестирование.
|
a |
b |
i |
k |
i1 = f1 |
i2 = f2 |
res = f3 |
|
1 |
2 |
2 |
0 |
2 |
6 |
8 |
|
2 |
1 |
2 |
1 |
-11 |
-20 |
-20 |
|
2 |
1 |
2 |
0 |
-11 |
-20 |
31 |
Выводы.
В результате работы были разобраны некоторые базовые концепции языка ассемблера. Были изучены команды сравнения, условного и безусловного перехода. Была написана рабочая программа, рассчитывающая значения кусочных математических функций.
Приложение
LR3.ASM
STACKSG SEGMENT PARA STACK 'Stack'
DW 32 DUP(?)
STACKSG ENDS
DATASG SEGMENT PARA 'Data' ;SEG DATA
VARA DW 1h
VARB DW 1h
VARI DW 1h
VARK DW 1h
VARI1 DW 1h
VARI2 DW 1h
VARRES DW 1h
DATASG ENDS ;ENDS DATA
CODE SEGMENT ;SEG CODE
ASSUME DS:DataSG, CS:Code
Main PROC FAR
mov ax, DATASG ;ds setup
mov ds, ax
jmp f1
f1_end:
mov ax,VARI1
pop VARI1
jmp f2
f2_end:
pop VARI2
jmp f3
f3_end:
pop VARRES
mov ah, 4ch ;exit
int 21h