Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Gazu1Z3ovv.file.doc
Скачиваний:
1
Добавлен:
30.04.2022
Размер:
232.45 Кб
Скачать

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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]