- •Теория операционных систем. Программирование на ассемблере методические указания
- •1. Введение в теорию ос
- •1.1. Указания к выполнению работы
- •1.2. Учебные темы и вопросы
- •Тема 1. Основные понятия
- •Тема 2. Прерывания
- •Тема 3. Распределение процессорного времени
- •Тема 4. Непрерывные способы распределения оп
- •Тема 5. Разрывные способы распределения оп (виртуальная память)
- •2. Введение в программирование на ассемблере
- •2.1. Указания к выполнению работы
- •3. Выполнять работу рекомендуется следующим образом:
- •2.2. Представление целых в памяти пк
- •2.3. Ассемблер: начальные сведения. Директивы описания
- •2.4. Команды сложения и вычитания
- •2.5. Команды условного и безусловного перехода
- •2.6. Работа с циклами и массивами
2.4. Команды сложения и вычитания
Задание 4. Изучить особенности сложения и вычитания целых чисел в ПК (беззнаковых и со знаком). Разобраться, для чего служат флаги переноса (CF) и переполнения мантиссы (OF). Изучить команду сложения ADD и команду вычитания SUB, допустимые типы операндов, устанавливаемые флаги.
Написать фрагмент программы на ассемблере (описание переменных и команды вычислений) в соответствии с указанным вариантом из табл. 5. Подобрать числовые значения таким образом, чтобы команды устанавливали различные флаги условий (OF,CF,ZF,SF); в каждом варианте – по крайней мере 3 различных флага. В комментариях к командам указать получаемые значения флагов.
В заданиях «массив байт» означает массив целых типа байт, а «массив слов» – массив целых типа слово.
Таблица 5
Варианты заданий на команды сложения и вычитания
№ |
Задание |
1 |
F – массив 5 слов. Вычтите из первого числа остальные. Результат поместите в СX. |
2 |
A – массив из 5 байтов. Вычислите сумму элементов массива и результат поместите в DH. |
3 |
F – массив 5 слов. Вычтите из среднего числа сумму остальных. Результат поместить в ВX. |
4 |
А – массив из 4 байт. Выполнить сложение двух первых и двух последних. Найти разность полученных промежуточных сумм. Результат поместить в BL. |
Окончание табл. 5
5 |
G – массив из 4 слов. Выполнить сложение двух средних и двух крайних. Найти разность полученных промежуточных сумм. Результат поместить в BX. |
6 |
G – массив из 4 слов. Выполнить сложение двух первых и двух последних. Найти разность полученных промежуточных сумм. Результат поместить в BP. |
7 |
А – массив из 4 байт. Выполнить сложение двух крайних и двух средних. Найти разность полученных промежуточных сумм. Результат поместить в BH. |
8 |
G – массив 5 байт. Вычтите из среднего числа сумму остальных. Результат поместить в ВL. |
9 |
Пусть M – массив из 4 слов. Вычислите сумму элементов массива и результат поместите в DX. |
10 |
G – массив из 4 слов. Вычислите сумму элементов массива и результат поместите в DX. |
Рекомендуемая литература:
Пильщиков. Параграф 3.3. «Команды сложения и вычитания».
Примеры программ :
add_sub.asm
2.5. Команды условного и безусловного перехода
Изучить приведенный ниже материал.
Безусловный переход
Безусловный переход осуществляется с помощью следующей команды:
JMP op
Здесь операнд тем или иным способом указывает адрес перехода, т.е. адрес команды, которая должна быть выполнена следующей. Существуют два варианта безусловного перехода: прямой и косвенный.
Прямой переход
В данном случае в качестве операнда указывается метка той команды, на которую надо передать управление:
JMP <метка>
Пример:
JMP L
…
L: MOV AX, 0
В машинной команде адрес перехода рассчитывается как разность между адресом команды, на которую надо перейти, и адресом самой команды перехода (т.е. как бы относительный адрес относительно содержимого регистра IP. При выполнении команды это смещение складывается с содержимым IP). Под смещение в команде отводится либо 1 байт (короткий переход), либо 2 байта (длинный переход). Это делается для экономии памяти. Ассемблер сам решает, какой сгенерировать.
Косвенный переход
JMP <регистр> или JMP <слово памяти>
Содержимое указанного в команде регистра или слова памяти рассматривается как адрес, по которому нужно делать переход (“настоящий”, а не смещение от IP).
Пример:
B DW L ; слово памяти (переменная),
; проинициализированное значением
; метки L, т.е. адресом
…
MOV DX, B ; в DX пересылается значение метки L
JMP DX ; goto [DX] = goto L Переход по адресу,
; записанному в регистр DX
…
JMP B ; goto [B] = goto L
; переход по адресу, записанному в B
………
L: MOV AX, 0
Существует проблема, с которой сталкивается ассемблер при трансляции команд безусловного перехода. Предположим, что существует команда JMP Z, где Z – некоторое имя (но не имя регистра). По самому имени Z нельзя догадаться, какой переход будет осуществлен – прямой или косвенный. Если имя Z описано до команды JMP, то проблемы нет: если именем Z помечена команда, то осуществляется переход по метке, а если имя Z описано в директиве DW, то осуществляется косвенный переход.
Но если Z – ссылка вперед, т.е. это имя описывается позже, то ассемблер не будет знать, какой здесь переход. Для решения проблемы неоднозначности принято следующее правило: при ссылке вперед ассемблер считает, что Z – метка и формирует команду прямого перехода. Если Z не является меткой, то будет зафиксирована ошибка.
Сравнение и условный переход
Если переход осуществляется только при выполнении некоторого условия и не осуществляется в противном случае, то такой переход называется условным. Условный переход обычно реализуется в два шага: сначала сравниваются некоторые величины, в результате чего соответствующим образом формируются флаги (ZF, SF и т.д.), а затем выполняется условный переход в зависимости от значений флагов.
Команда сравнения записывается следующим образом:
CMP op1, op2
Данная команда идентична команде вычитания, но ее результат никуда не записывается. Основной результат выполнения команды CMP – установка флагов, характеризующих полученную разность, по значению которой можно понять соотношение сравниваемых величин. Рассматриваются значения флагов ZF, SF, CF, OF.
Существует достаточно большое количество команд перехода, записываемых по следующей схеме:
JXX <метка>
Операнд указывает метку той команды программы, на которую надо сделать переход в случае выполнения некоторого условия, а мнемокод начинается буквой J (от jump – прыжок), за которой следует одна или несколько букв, в сокращенном виде описывающих это условие.
Все команды условного перехода можно разделить на три группы.
Группа 1. Команды, ставящиеся после команды сравнения.
В мнемокодах данных команд с помощью определенных букв описывается тот результат сравнения, при котором надо делать переход. Это следующие буквы:
E – equal (равно);
N – not (отрицание);
G – greater (больше) – для чисел со знаком;
L – less (меньше) – для чисел со знаком;
A – above (выше, больше) – для чисел без знака;
B – below (ниже, меньше) – для чисел без знака.
Для условий «меньше» и «больше» введены две системы обозначений. Это связано с тем, что после сравнения чисел со знаком и сравнения чисел без знака надо реагировать на разные значения флагов.
В табл. 6 приведены названия всех команд условного перехода, используемых после команды сравнения (через косую черту указаны названия-синонимы).
Таблица 6
Команды условного перехода, ставящиеся после команды сравнения
Мнемокод |
Условие перехода |
Состояние флагов |
для любых чисел |
||
JE |
op1 = op2 |
ZF = 1 |
JNE |
op1 <> op2 |
ZF = 0 |
для чисел со знаком |
||
JL / JNGE |
op1 < op2 |
SF <> OF |
JLE / JNG |
op1 <= op2 |
SF <> OF или ZF = 1 |
JG / JNLE |
op1 > op2 |
SF = OF и ZF = 0 |
JGE / JNL |
op1 >= op2 |
SF = OF |
для чисел без знака |
||
JB / JNAE |
op1 < op2 |
CF = 1 |
JBE / JNA |
op1 <= op2 |
CF = 1 или ZF = 1 |
JA / JNBE |
op1 > op2 |
CF = 0 и ZF = 0 |
JAE / JNB |
op1 >= op2 |
CF = 0 |
Пример использования:
Пусть X,Y,Z – переменные размером в слово. Записать в Z максимальное из чисел X и Y.
Для чисел со знаком |
Для чисел без знака |
MOV AX,X CMP AX,Y JGE L1 MOV AX,Y L1: MOV Z,AX |
MOV AX,X CMP AX,Y JAE L1 MOV AX,Y L1: MOV Z,AX |
Группа 2. Команды условного перехода по значению флага.
В мнемокодах данных команд указывается первая буква проверяемого флага, если переход должен быть выполнен при значении 1 у флага, либо эта буква указывается с буквой N (not), если переход надо сделать при нулевом значении флага.
В табл. 7 приведен список данных команд.
Таблица 7
Команды условного перехода по значению флагов
Мнемокод |
Условие перехода |
Мнемокод |
Условие перехода |
JZ |
ZF=1 |
JNZ |
ZF=0 |
JS |
SF=1 |
JNS |
SF=0 |
JC |
CF=1 |
JNC |
CF=0 |
JO |
OF=1 |
JNO |
OF=0 |
JP |
PF=1 |
JNP |
PF=0 |
Пример использования:
Пусть X,Y,Z – беззнаковые байтовые переменные. Вычислить Z = X*X + Y, но если Z сумма не помещается в байт, то управление передать на метку ERROR и выдать сообщение об ошибке.
MOV AL, X
MUL AL
JC ERROR ; A*A > 255 (CF=1) –> ERROR
ADD AL, Z
JC ERROR ; CF=1 –> ERROR
MOV C, AL
Группа 3. Команда условного перехода по значению счетчика (регистра CX).
Команда записывается следующим образом:
JCXZ <метка>
Действие команды JCXZ (jump if CX is zero) можно описать так:
if CX = 0 then goto <метка>
Используется, например, для организации цикла вместе с командой LOOP (см. ниже).
Все команды условного перехода осуществляют только короткий переход (не более, чем на 128 байт – примерно 30-40 команд). Для реализации длинного условного перехода необходимо использовать конструкции вида:
CMP AX,BX
JNE L ; if AX<>BX then goto L
JMP M ; goto M
L: ……..
Данный фрагмент программы задает переход на метку M при условии равенства содержимого регистров AX и BX.