Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры по архитектуре ЭВМ.doc
Скачиваний:
46
Добавлен:
02.05.2014
Размер:
238.59 Кб
Скачать

14. Сдвиговые операторы. Синтаксис.

К их числу относят shl, sal, shr, sar, ror, rol, rcr, rcl.

shl, sal – осуществляют сдвиг влево числа в первом операнде на 1 бит, либо на n>1 бит.

В последнем случае число n должно быть положительно записано в регистр cl, который задается в качестве второго операнда. Выделяется левый бит помещается в с освобожденный правый бит – в нуль.

mov al, 10010001b

shl al,1; al=00100010b и с=1 (al=al*2)

shl al,1; al=01000100b и с=0 (al=al*2)

sal al,1; al=10001000b и с=0 (al=al*2)

Сдвиг числа влево на 1 бит эквивалентен умножению на 2.

mov al,10010001b

mov cl,3

shl al,cl; al=10001000b и с=0 (al=al*8)

shr подобна shl, но сдвиг осуществляется вправо.

Сдвиг вправо эквивалентен делению на 2.

sar так-же подобно shr, но в отличии от нее не изменяет ставший бит.

mov bl,10001001b

sar bl,1; bl=11000100b; c=1

Использование этой команды позволяет сохранять знак результата.

Команды ror, rol, rcr, rcl называют командами вращения.

Поворот битов осуществляется либо на 1, либо на число, значащееся в регистре cl.

ror подобна shr за исключением того, что правый выдвинутый бит наряду с параметром с помещается в левый выдвинувшийся бит.

rcr и rcl – возвращает бит через признак переноса с.

rol – левый выдвинутый бит наряду с с помещается в правый выдвинутый бит.

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

Команды машинной программы выполняются в том порядке, как они записаны в памяти. Но время от времени этот естественный порядок выполнения команд приходится нарушать с тем, чтобы следующей выполнялась не очередная команда программы, а какая-то иная. Такую возможность обеспечивают команды перехода.

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

Отметим, что в ПК команды перехода не меняются флаги: какое значение флаги имели до команды перехода, такое же значение они будут иметь и после нее. Дальше мы уже не будем об этом упоминать.

Изучение команд перехода начнем с безусловного перехода.

В ПК имеется несколько машинных команд безусловного перехода, но в ЯА они все обозначаются одинаково:

Безусловный переход (jump): JMP op

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

Различают следующие переходы:

- short (короткий). Исп-ся, если адрес перехода находится в пределах со значением -128 to +127 от к-ды jmp

- near (ближний) – если адрес перехода находится в том же сегменте памяти, что и к-да jmp.

- far (дальний) – адрес перехода в другом сегменте. Может выполняться в том же самом сегменте при условии, что в сегментной части операнда указано число, совпадающее с текущим значением регистра cs.

16. Команды сравнения и передачи управления.

Если переход осуществляется только при выполнении некоторого условия и не осуществляется в противном случае, то такой переход называется условным. Условный переход обычно реализуется в два шага: сначала сравниваются некоторые величины, в результате чего соответствующим образом формируются флаги (ZF, SF и т. д.), а затем выполняется собственно условный переход в зависимости от значений флагов. Поэтому мы сейчас рассмотрим и команду сравнения, и команды условного перехода.

Сравнение (compare): CMP op1,op2

Эта команда эквивалентна команде SUB op1,op2 за одним исключением: вычисленная разность op1-op2 никуда не записывается. Поэтому единственный и главный эффект от команды сравнения - это установка флагов, характеризующих полученную разность, или, что то же самое, характеризующих сравниваемые величины ор1 и ор2. Как формируются флаги при вычитании, мы уже рассматривали (см. лаб. 5), поэтому повторяться не будем.

Что же касается команд условного перехода, то их в ПК достаточно много, но в ЯА они все записываются единообразно:

Jxx <метка>

где операнд указывает метку той команды программы, на которую надо сделать переход в случае выполнения некоторого условия, а мнемокод начинается буквой J (от jump), за которой следует одна или несколько букв, в сокращенном виде описывающих это условие.

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

В первую группу входят команды, которые ставятся после команды сравнения. В их мнемокодах с помощью определенных букв описывается тот исход сравнения, при котором надо делать переход. Это такие буквы:

Е - equal (равно)

N - not (не, отрицание)

G - greater (больше) - для чисел со знаком

L - less (меньше) - для чисел со знаком

А - above (выше, больше) - для чисел без знака

В - below (ниже, меньше) - для чисел без знака

Как видно, для условий "меньше" и "больше" введены две системы обозначений. Это связано с тем, что после сравнения чисел со знаком и сравнения чисел без знака надо реагировать на разные значения флагов.

Отметим, что одна и та же команда условного перехода может иметь в ЯА несколько названий-синонимов. Это объясняется тем, что одно и то же условие перехода может быть сформулировано по-разному. Например, условие "меньше" - это в то же время и условие "не верно, что больше или равно", поэтому переход по меньше для знаковых чисел обозначается и как JL, и как JNGE. Какое из этих названий-синонимов использовать - это личное дело автора программы.

Теперь приведем названия всех команд условного перехода, используемых после команды сравнения (через косую черту указаны названия-синонимы):

Мнемокод

Содержательное условие для перехода после СМР ор1,ор2

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

для любых чисел

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

(Объясним, к примеру, почему в команде условного перехода "по меньше" для знаковых чисел (JL) проверяется соотношение OF<>SF. Если в команде СМР op1,op2 сравниваемые числа трактуются как знаковые, тогда возможны две комбинации флагов, соответствующие условию op1<op2. Во-первых, если при вычитании op1-op2 не было переполнения мантиссы (OF=0), тогда флаг SF фиксирует настоящий знак разности op1-op2 и потому SF=1 означает, что op1-op2<0, т. е. op1<op2. Во-вторых, если при вычитании произошло переполнение мантиссы (OF=1), тогда результатом команды будет число с противоположным знаком, чем у настоящей разности, и поскольку флаг SF фиксирует не знак настоящей разности, а знак результата команды, то условие SF=0 означает, что у искаженного результата знак положителен, а значит, у настоящей разности знак отрицателен, т. е. op1<op2. Итак, условию op1<op2 соответствует либо OF=0 и SF=1, либо OF=1 и SF=0, что можно записать более коротко: OF<>SF. Именно это условие и указано в таблице для команды JL.)

Пример. Пусть X, Y и Z - переменные размером в слово. Требуется записать в Z максимальное из чисел X и Y.

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

;числа со знаком ;числа без знака

MOV АХ,Х MOV АХ,Х

СМР AX,Y ;х=у? СМР AX,Y

JGE М ;х>=у а M JAE M

MOV AX,Y MOV AX,Y

M: MOV Z,AX M: MOV Z,AX

Во вторую группу команд условного перехода входят те, которые ставятся после команд, отличных от команды сравнения, и которые реагируют на то или иное значение какого-нибудь определенного флага. В мнемокодах этих команд указывается первая буква проверяемого флага, если переход должен быть выполнен при значении 1 у флага, либо эта буква указывается с буквой N (not), если переход надо сделать при нулевом значении флага:

Мнемокод

Условие перехода

Мнемокод

Условие перехода

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

(Замечание. Легко заметить, что следующие пары мнемокодов эквиваленты: JE и JZ, JNE и JNZ, JB и JC, JNB и JNC.)

Пример. Пусть А, В и С - беззнаковые байтовые переменные. Требуется вычислить С=А*А+В, но если ответ превосходит размер байта, тогда надо передать управление на метку ERROR.

Возможное решение этой задачи:

MOV AL,A

MUL AL

JC ERROR ;A*A > 255 (CF=1) а ERROR

ADD AL,B

JC ERROR ;перенос (CF=1) а ERROR

MOV C,AL

И, наконец, в третью группу входит только одна команда условного перехода, проверяющая не флаги, а значение регистра СХ:

JCXZ <метка>

Действие команды JCXZ (jump if CX is zero) можно описать так:

if CX=0 then goto <метка>