Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Форматы арифметических данных



Арифметические операции могут выполняться над операндами
4-х типов:

u Двоичные без знака.

u Двоичные со знаком (целые).

u Упакованные десятичные без знака.

u Распакованные десятичные без знака.

Двоичные числа могут занимать 1 или 2 байта. Десятичные числа хранятся побайтно по 2 десятичной цифре на байт для упакованного формата или по 1 десятичной цифре на байт для распакованного формата. Процессор предполагает, что определенные в арифметических инструкциях операнды содержат данные, представляющие корректные для данной инструкции числа. Некорректные данные могут привести к непредсказуемым результатам.

Двоичные числа без знака могут занимать 8 или 16 бит; все биты значимы. Диапазон значений 8-битового числа — от 0 до 255, 16-битово
го — от 0 до 65535. Над двоичными числами без знака можно выполнять операции сложения, вычитания, умножения и деления.

Двоичные числа со знаком (целые) могут занимать также 8 или 16 бит. Значение старшего бита (самого левого) задает знак числа: 0 — положительное, 1 — отрицательное. Отрицательные числа представляются стандартным дополнением до 2. Поскольку один разряд отведен под знак, диапазон изменения 8-битового числа — от -127 до +127, 16-битового — от -32768 до +32767. Число 0 имеет положительный знак. Над двоичными числами со знаком могут быть выполнены операции умножения и деления. Сложение и вычитание выполняются без учета знака. Для обнаружения переноса в знаковый разряд в результате беззнаковой операции можно использовать инструкции условного перехода или INTO.

Упакованные десятичные числа хранятся как беззнаковые байтовые величины. Каждый байт содержит 2 десятичные цифры, занимающие по 4 бита каждая. Цифра в старшем полубайте более значима. В каждом полубайте допустимы только 16-ричные значения от 0 до 9; соответственно пределы изменения десятичного числа — от 0 до 99. Сложение и вычитание таких чисел выполняются в 2 стадии. Сначала применяется обычная беззнаковая двоичная инструкция, которая формирует в регистре AL промежуточный результат. Затем выполняется операция настройки (инструкция DAA или DAS ), преобразующая содержимое AL в корректный упакованный десятичный результат. Умножение и деление упакованных десятичных чисел невозможно.

Распакованные десятичные числа хранятся как беззнаковые байтовые величины. Десятичная цифра располагается в младшем полубайте. Допустимы и интерпретируются как десятичные числа 16-ричные значения от 0 до 9. Для выполнения операций умножения и деления старший полубайт должен быть заполнен нулями; для сложения и вычитания он может содержать любое значение.

Арифметические операции над распакованными десятичными числами выполняются в две стадии. Сначала используются обычные беззнаковые инструкции сложения, вычитания или умножения, которые формируют в регистре AL промежуточный результат. Затем выполняется операция настройки (инструкция AAA, AAS или AAM ), преобразующая содержимое AL в результирующее корректное распакованное десятичное число. Деление выполняется аналогично, за исключением того, что сначала следует настроить числитель в AL (инструкция AAD ), а затем выполнить инструкцию беззнакового двоичного деления, результатом которого будет корректное распакованное десятичное число.

Формат десятичных распакованных чисел подобен представлению десятичных цифр в коде ASCII. При этом для числа в коде ASCII старший полубайт содержит 16-ричное значение 3. Возможное содержимое старшего полубайта для распакованного формата приведено выше. Преобразование из одного вида в другой сложности не представляет.

Арифметические операции и флаги

Арифметические инструкции оставляют после своего выполнения некоторые характеристики результатов операций в виде значений 6 флагов. Большинство из них могут анализироваться последующими инструкциями условного перехода; может также использоваться инструкция прерывания по переполнению INTO. Влияние каждой инструкции на флаги указано при описании инструкции.

Однако имеются следующие общие правила:

1. Флаг переноса CF устанавливается в 1, если в результате операции сложения был перенос из старшего бита или в результате операции вычитания был заем в старший бит результата. Если же переноса или заема не было, CF устанавливается в 0. Заметим, что знаковый перенос характеризуется различными значениями флагов CF и OF. Флаг CF может использоваться для обнаружения беззнакового переполнения. Следует помнить, что две инструкции, ADC (сложение с переносом) и SBB (вычитание с заемом) вовлекают CF в свои операции и могут быть поэтому использованы для мультибайтного (32-, 64-разрядного) сложения и вычитания.

2. Флаг промежуточного переноса AF устанавливается в 1 при переносе из младшего полубайта результата во время сложения или при заеме в младший полубайт результата во время вычитания. Если же переноса или заема не было, AF устанавливается в 0. Флаг AF введен для выполнения десятичной настройки и обычно в других целях не используется.

3. Флаг знака SF устанавливается арифметическими и логическими инструкциями равным старшему (7-му или 15-му) биту результата. Для двоичных чисел со знаком SF будет равен 0 в случае положительного результата и 1 — в случае отрицательного (если нет переполнения). Значение флага SF может анализироваться после сложения или вычитания инструкциями условного перехода. Программы, выполняющие беззнаковые операции, обычно игнорируют SF, так как старший бит результата в этом случае интерпретируется как двоичная цифра, а не как знак.

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

5. Флаг паритета PF устанавливается в 1, если младшие 8 бит результата арифметической или логической операции содержат четное число единиц, и устанавливается в 0, если число единиц нечетно. Флаг PF может использоваться для контроля символов в коде ASCII на корректность паритета.

6. Флаг переполнения OF устанавливается в 1, если результат слишком велик для положительного числа или слишком мал для отрицательного и не помещается в операнд-приемник (не считая знаковый разряд). В противном случа значение OF — 0. Состояние этого флага отражает наличие арифметического переполнения со знаком. Он может анализироваться инструкциями условного перехода или инструкцией INTO. В беззнаковых операциях OF обычно игнорируется.

Сложение

ADD приемник, источник

Сложение байтов или слов. Арифметическая сумма 2-х операндов, которыми могут быть байты или слова, замещает операнд-приемник. Оба операнда могут содержать двоичные числа со знаком или без него. ADD модифицирует флаги AF, CF, OF, PF, SF и ZF.

ADC приемник, источник

Сложение с переносом. Эта инструкция выполняет арифметическую сумму своих операндов, добавляет 1, если установлен в 1 флаг CF, и помещает результат на место операнда-приемника. Оба операнда могут содержать двоичные числа со знаком или без него. ADC модифицирует флаги AF, CF, OF, PF, SF и ZF. Поскольку ADC использует перенос от предыдущей операции, она может применяться для сложения чисел длиннее 2 байтов.

INC приемник

Увеличение байта или слова на 1.

К содержимому приемника прибавляется 1. Операнд может быть байтом или словом и рассматривается как двоичное число без знака. INC модифицирует флаги AF, OF, PF, SF и ZF и не влияет на CF.

AAA

ASCII-настройка для сложения. Эта инструкция преобразует содержимое регистра AL в корректное распакованное десятичное число; старший полубайт обнуляется. AAA модифицирует флаги AF и CF; состояния флагов OF, PF, SF и ZF после AAA не определены.

DAA

Десятичная настройка для сложения. Эта инструкция корректирует результат предшествующего сложения 2-х правильных упакованных десятичных чисел, содержащихся в регистре AL. Содержимое AL преобразуется в пару корректных упакованных десятичных чисел. DAA модифицирует флаги AF, CF, PF, SF и ZF; состояние флага OF после DAA не определено.

Вычитание

SUB приемник, источник

Вычитание байтов или слов. Содержимое источника вычитается из содержимого приемника, и результат помещается на место приемника. Операнды могут быть байтами или словами и содержать двоичные числа со знаком или без него. SUB модифицирует флаги AF, CF, OF, PF, SF и ZF.

SBB приемник, источник

Вычитание с заемом. По этой инструкции содержимое источника вычитается из содержимого приемника, из результата вычитается еще 1, если установлен в 1 флаг CF, и окончательный результат помещается на место приемника. Оба операнда могут быть байтами или словами и содержать двоичные числа со знаком или без него. SBB модифицирует флаги AF, CF, OF, PF, SF и ZF. Поскольку SBB использует заем предыдущей операции, она может применяться для вычитания чисел длиннее 2 байтов.

DEC приемник

Уменьшение байта или слова на 1. Содержимое приемника уменьшается на 1. Приемник может быть байтом или словом. DEC модифицирует флаги AF, OF, PF, SF и ZF и не влияет на состояние CF.

NEG приемник

Отрицание байта или слова. По этой инструкции содержимое приемника, который может быть байтом или словом, вычитается из 0, и результат помещается на место приемника. Эта форма дополнения до 2 используется для изменения знака целого числа. Если операнд равен 0, его знак не изменяется.

Попытка отрицания байта, содержащего -128, или слова, содержащего -32768, не изменяет операнд, но устанавливает в 1 флаг OF. NEG модифицирует флаги AF, CF, OF, PF, SF и ZF. Флаг CF всегда устанавливается в 1, исключая тот случай, когда операнд равен 0 (тогда и CF=0 ).

CMP приемник, источник

Сравнение байтов или слов. Инструкция CMP вычитает содержимое источника из содержимого приемника, но результат не возвращает.

Операнды, которые могут быть байтами или словами, не изменяются, но модифицируются флаги AF, CF, OF, PF, SF и ZF, что может анализироваться последующими инструкциями условного перехода.

Состояния этих флагов отражают отношение приемника к источнику. Например, если после CMP следует инструкция JG, переход произойдет, если содержимое приемника больше содержимого источника.

AAS

ASCII-настройка для вычитания. Эта инструкция преобразует находящийся в регистре AL результат предшествующей операции вычитания 2-х корректных десятичных распакованных чисел в корректное десятичное распакованное число, остающееся также в AL.

Старший полубайт регистра AL обнуляется. AAS модифицирует флаги AF и CF; состояния флагов OF, PF и ZF после AAS не определены.

DAS

Десятичная настройка для вычитания.

Эта инструкция преобразует находящийся в регистре AL результат предшествующей операции вычитания 2-х корректных десятичных упакованных чисел в пару корректных десятичных упакованных цифр, остающихся также в AL. DAS модифицирует флаги AF, CF, PF, SF и ZF; состояние флага OF не определено.

 

 

Умножение

MUL источник

Умножение байтов или слов без знака. Инструкция MUL выполняет беззнаковое умножение содержимых источника и аккумулятора. Если источник является байтом, в качестве аккумулятора используется регистр AL, а результат двойной длины помещается в регистры AH и AL. Если источник является словом, в качестве аккумулятора используется регистр AX, а результат двойной длины помещается в регистры DX и AX. Операнды рассматриваются как двоичные числа без знака. Если старшая половина результата (содержимое AH для источника-байта или содержимое DX для источника-слова) не равна 0, флаги CF и OF устанавливаются в 1, в противном случае — в 0. Когда CF и OF установлены в 1, это означает, что AH или DX содержит значимые цифры результата. Состояния флагов AF, PF, SF и ZF после MUL не определены.

IMUL источник

Целочисленное умножение байтов или слов. Инструкция IMUL выполняет умножение со знаком содержимых источника и аккумулятора. Если источник является байтом, в качестве аккумулятора используется регистр AL, а результат двойной длины помещается в регистры AH и AL. Если источник является словом, в качестве аккумулятора используется регистр AX, а результат двойной длины помещается в регистры DX и AX. Если старшая половина результата (содержимое AH для источника-байта или содержимое DX для источника-слова) не является расширением знака младшей половины, флаги CF и OF устанавливаются в 1, в противном случае — в 0. Когда CF и OF установлены в 1, это означает, что AH или DX содержит значимые цифры результата. Состояния флагов AF, PF, SF и ZF после IMUL не определены.

AAM

ASCII-настройка для умножения.

Инструкция AAM корректирует результат предшествующей операции умножения 2-х корректных десятичных распакованных операндов. Корректное десятичное распакованное число, состоящее из 2-х цифр, извлекается из регистров AH и AL, и результат возвращается в регистры AH и AL. Старшие полубайты перемножаемых операндов должны быть обнулены, что необходимо AAM для формирования правильного результата. AAM модифицирует флаги PF, SF и ZF; состояния флагов AF, CF и OF после AAM не определены.

Деление

DIV источник

Деление байтов или слов без знака. Инструкция DIV выполняет беззнаковое деление содержимого аккумулятора (и его расширения) на содержимое источника. Если источник является байтом, предполагается, что делимое расположено в регистрах AH и AL. Частное остается в регистре AL, остаток — в регистре AH. Если источник является словом, предполагается, что делимое расположено в регистрах DX и AX. Частное в этом случае остается в регистре AX, остаток — в регистре DX. Если значение частного превосходит вместимость регистра-приемника (FFh для источника-байта или FFFFh для источника-слова), возникает ситуация «деление на 0» и генерируется прерывание с номером 0; частное и остаток в этом случае не определены.

Дробная часть частного отсекается. После DIV состояния флагов AF, CF, OF, PF, SF и ZF не определены.

IDIV источник

Целочисленное деление байтов или слов. Инструкция IDIV выполняет деление со знаком содержимого аккумулятора (и его расширения) на содержимое источника. Если источник является байтом, предполагается, что делимое расположено в регистрах AH и AL. Частное остается в регистре AL, остаток — в регистре AH. Для такого деления максимально допустимое положительное частное равно 127 (7Fh), а минимально допустимое отрицательное частное равно -127 (81h). Если источник является словом, предполагается, что делимое расположено в регистрах DX и AX. Частное в этом случае остается в регистре AX, остаток — в регистре DX. Для такого деления значение частного может находиться в пределах от -32767 (8001h) до 32767 (7FFFh). Если частное положительно и превышает положительный максимум или отрицательно и меньше отрицательного минимума, генерируется прерывание с номером 0 (деление на 0); частное и остаток в этом случае не определены. Нецелочисленное частное округляется до целого числа (по направлению к 0). Остаток имеет тот же знак, что и делимое. После IDIV состояния флагов AF, CF, OF, ZF, PF и SF не определены.

AAD

ASCII-настройка для деления. Инструкция AAD модифицирует числитель в регистре AL перед делением 2-х корректных десятичных распакованных операндов таким образом, чтобы частное от деления было также корректным десятичным распакованным числом. Для того, чтобы последующая инструкция DIV сформировала правильный результат, регистр AH должен содержать нули. Частное остается в регистре AL, остаток — в регистре AH; оба старших полубайта обнуляются. AAD модифицирует флаги PF, SF и ZF; состояния флагов AF, CF и OF после AAD не определены.

CBW

Преобразование байта в слово. Инструкция CBW заполняет регистр AH битами, равными знаковому биту однобайтного числа в регистре AL. CBW на состояния флагов не влияет. Эта инструкция может использоваться для получения делимого двойного размера (слова) из результата предшествующей операции деления байтов.

CWD

Преобразование слова в двойное слово. Инструкция CWD заполняет регистр DX битами, равными знаковому биту двухбайтного числа в регистре AX. CWD на состояния флагов не влияет. Эта инструкция может использоваться для получения делимого двойного размера (двойного слова) из результата предшествующей операции деления слов.

Инструкции обработки бит

Имеется 3 группы инструкций для обработки бит в форматах байта или слова: логические, сдвиги и вращения (все операции выполняются и над байтами, и над словами).

Логические инструкции

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

Инструкции AND, OR, XOR и TEST следующим образом влияют на флаги. Флаги OF и CF логическими инструкциями всегда устанавливается в 0, а состояние флага AF не определено. Состояния флагов SF, ZF и PF отражают результат операции и могут анализироваться инструкциями условного перехода. Интерпретация этих флагов такая же, как для арифметических инструкций. Флаг SF устанавливается в 1, если результат отрицателен (старший бит равен 1), и устанавливается в 0, если результат положителен (старший бит равен 0). Флаг ZF устанавливается в 1, если результат равен 0, и устанавливается в 0 в противном случае. Флаг PF устанавливается в 1, если результат содержит четное число единиц, и устанавливается в 0 в противном случае. Инструкция NOT на состояния флагов не влияет.

NOT приемник

Отрицание. Инструкция NOT инвертирует все биты (формирует дополнение до 1) байта или слова.

AND приемник, источник

Логическое И. Инструкция AND выполняет операцию логическое И двух операндов (байтов или слов) и возвращает результат в операнд-приемник. Бит результата устанавливается в 1, если установлены в 1 оба соответствующих ему бита операндов, и устанавливается в 0 в противном случае.

OR приемник, источник

Включающее ИЛИ. Инструкция OR выполняет операцию логическое включающее ИЛИ двух операндов (байтов или слов) и помещает результат на место операнда-приемника. Бит результата устанавливается в 1, если равен 1 хотя бы один из 2-х соответствующих ему битов операндов, и устанавливается в 0 в противном случае.

XOR приемник, источник

Исключающее ИЛИ. Инструкция XOR выполняет операцию логическое исключающее ИЛИ 2-х операндов и помещает результат на место операнда-приемника. Бит результата устанавливается в 1, если соответствующие ему биты операндов имеют противоположные значения, и устанавливается в 0 в противном случае.

TEST приемник, источник

Тестирование. Инструкция TEST выполняет операцию логическое И двух операндов (байтов или слов), модифицирует флаги, но результат не возвращает, то есть, операнды не изменяются. Если за TEST следует инструкция JNZ (переход, если не 0), то переход будет иметь место, если в обоих операндах имеются единицы в совпадающих позициях.

Сдвиги

Биты в байтах или словах могут быть сдвинуты арифметически или логически. В соответствии с кодируемым в инструкции счетчиком может быть выполнено до 255 сдвигов. Счетчик может быть специфицирован как константа 1 или как регистр CL, что позволяет задавать величину сдвига в процессе работы программы. Арифметические сдвиги могут быть использованы для умножения и деления двоичных чисел на степени 2. Логические сдвиги могут применяться для выделения битов в байтах или словах.

Инструкции сдвига следующим образом воздействуют на флаги. Состояние флага AF всегда не определено после операции сдвига. Воздействие на флаги PF, SF и ZF аналогично логическим инструкциям. Флаг CF всегда содержит значение последнего сдвинутого за пределы операнда приемник бита. Состояние флага OF после многобитного сдвига всегда не определено. При единичном сдвиге OF устанавливается в 1, если в результате операции знаковый бит изменил свое значение, и устанавливается в 0 в противном случае.

SHL/SAL приемник, счетчик

Сдвиг влево. Инструкции SHL и SAL выполняют операции соответственно логического и арифметического сдвига влево операнда приемник на величину бит, определяемую счетчиком. Приемник может быть байтом или словом. Появляющиеся справа биты заполняются нулями. Если знаковый бит сохраняет первоначальное значение, флаг OF устанавливается в 0.

 

SHR приемник, источник

Логический сдвиг вправо. Инструкция SHR сдвигает биты операнда приемник (байта или слова) вправо на число разрядов, определяемое операндом счетчик. Появляющиеся слева биты заполняются нулями. Если знаковый бит сохраняет свое первоначальное значение, флаг OF устанавливается в 0.

SAR приемник, счетчик

Арифметический сдвиг вправо. Инструкция SAR сдвигает биты операнда приемник (байта или слова) вправо на число разрядов, определяемое операндом счетчик. Биты, равные первоначальному знаковому биту, появляются слева, сохраняя таким образом первоначальный знак числа. Отметим, что результат выполнения SAR отличается от делимого «эквивалентной» операции IDIV, если операнд приемника отрицателен и за его пределы сдвигаются единицы. Например, сдвиг числа -5 вправо на 1 бит дает -3, а деление -5 на 2 дает -2. Различие инструкций заключается в том, что IDIV округляет все числа по направлению к 0, а SAR округляет положительные числа к 0 и отрицательные — от нуля.

Вращения

Биты в байтах и словах можно вращать. Биты, сдвигаемые за пределы операнда, не теряются, как при сдвиге, а циклически появляются с другой стороны операнда. Как при сдвиге, величина вращения задается операндом счетчик, который может быть специфицирован как константа 1 или как регистр CL. Флаг CF может выступать как расширение операнда в двух инструкциях вращения (RCL и RCR), позволяя выделять бит во флаг CF и затем проверить его значение инструкциями JC или JNC. Вращения воздействуют только на флаг переноса CF и флаг переполнения OF.

Флаг CF всегда содержит значение последнего вышедшего за операнд бита. В многопозиционных вращениях состояние флага OF всегда не определено. В одиночном вращении OF устанавливается в 1, если операция изменяет значение старшего (знакового) бита операнда, и устанавливается в 0 в противном случае.

ROL приемник, счетчик

Вращение влево. Инструкция ROL вращает байт или слово приемника влево на число бит, определяемое счетчиком.

ROR приемник, счетчик

Вращение вправо. Инструкция ROR работает аналогично ROL, но вправо.

RCL приемник, счетчик

Вращение влево с переносом. Инструкция RCL вращает биты байта или слова приемника влево на число бит, определяемое счетчиком. Флаг CF рассматривается как часть приемника, то есть, его значение при этом вращении попадает в младший бит приемника, а сам CF принимает значение старшего бита приемника.

RCR приемник, счетчик

Вращение вправо с переносом. Инструкция RCR работает в точности как RCL с той лишь разницей, что биты вращаются вправо.

Инструкции обработки строк

Пять базовых строковых операций, называемых примитивами, позволяют оперировать со строками байтов или слов по одному элементу (байту или слову) за раз. Эти операции могут обрабатывать строки длиной до 64К. Операции со строками обеспечивают пересылку, сравнение, сканирование строк по значению, а также пересылку элементов строки в аккумулятор или из него. Этим базовыми инструкциям может предшествовать однобайтный префикс, наличие которого обеспечивает многократное повторение инструкции аппаратным способом, что гарантирует более высокое быстродействие, чем в случае программного цикла. Процесс повторения может быть прекращен при возникновении различных ситуаций, а сама повторяемая операция может быть как прервана, так и возобновлена.

Строковые инструкции во многом похожи друг на друга. Они могут иметь операнд-приемник, операнд-источник или оба эти операнда. Аппаратно предполагается, что исходная строка размещена в текущем сегменте данных (для ее адресации используется регистр DS ); для изменения этого допущения может использоваться однобайтный префикс изменения сегмента. Строка-приемник должна размещаться в текущем экстра сегменте (для ее адресации используется регистр ES ). Для проверки того, что является элементом строки (байт или слово), Ассемблер проверяет атрибуты операндов инструкции. Однако, в действительности эти операнды для адресации строк не используются. Для адресации используются регистры SI, который предполагается загруженным значением смещения строки-источника относительно содержимого DS, и DI, содержимое которого трактуется как смещение строки-приемника относительно содержимого ES. Все эти регистры должны быть загружены требуемыми значениями до выполнения строковой операции, для чего могут использоваться инструкции LDS, LES и LEA.

Строковые инструкции автоматически модифицируют содержимое регистров SI и/или DI для обеспечения возможности обработки следующего элемента строки. Значение флага направления DF определяет, будут ли эти индексные регистры автоматически увеличиваться ( DF=0 ) или автоматически уменьшаться ( DF=1 ) при переходе к следующему элементу строки. При обработке строк байтов содержимое SI и/или DI изменяется на 1; в случае строк слов — на 2.

Использование регистров и флагов строковыми инструкциями:

u SI — смещение строки-источника;

u DI — смещение строки-приемника;

u CX — счетчик повторений;

u AL/AX — значение сканирования: приемник для LODS, источник для STOS;

u DF 0 — автоматическое увеличение SI;

u DI 1 — автоматическое уменьшение SI;

u ZF — признак прекращения сканирования/сравнения.

При использовании префикса повторений содержимое регистра CX уменьшается на 1 после каждого повторения строковой инструкции. Регистр CX должен быть загружен требуемым числом повторений до выполнений строковой операции. Если CX содержит 0, строковая операция не выполняется, и управление передается следующей инструкции.

 

 

REP/REPE/REPZ/REPNE/REPNZ

Префиксы повторения. Эти ключевые слова представляют собой 5 мнемоник 2-х форм однобайтного префикса, управляющего повторением непосредственно следующей за ним строковой инструкции. Различные мнемоники введены для удобства программирования. Наличие префикса на состояния флагов не влияет.

REP используется в сочетании с инструкциями MOVS и STOS и интерпретируется как «повторение пока не конец строки» (в CX не 0). REPE и REPZ работают также и физически являются тем же префиксом, что и REP. REPE и REPZ используются в сочетании с инструкциями CMPS и SCAS и требуют, чтобы флаг ZF, используемый этими инструкциями, был установлен в 1 до инициализации следующего повторения.

REPNE и REPNZ представляют собой 2 мнемоники одного префикса и функционируют также, как REPE и REPF, но флаг ZF должен быть установлен в 0, или повторение прекратится. Заметим, что устанавливать флаг ZF перед выполнением повторяемой строковой инструкции необязательно.

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

Заметим, однако, что выполнение не возобновится правильно, если в дополнение к префиксу повторения был специфицирован 2-й или 3-й префикс (например, переключения сегмента или LOCK ). В момент прерывания процессор «запоминает» только один префикс, причем, тот, который при кодировании операции непосредственно предшествовал строковой инструкции.

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

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

Пересылка строк

MOVS приемник, источник

Пересылка строки байтов или слов. Эта инструкция пересылает байт или слово источника, адресуемого регистром SI, в строку-приемник, адресуемую регистром DI, и модифицирует содержимое регистров SI и DI таким образом, чтобы они указывали на следующие элементы строк. Величина элементов строк и соответственно тип пересылки (байт или слово) определяется Ассемблером путем анализа атрибутов операндов инструкции. При использовании префикса REP инструкция MOVS может пересылать блоки памяти.

MOVSB/MOVSW

Пересылка строки байтов или слов. Эти инструкции обеспечивают пересылку байта ( MOVSB ) или слова ( MOVSW ) из элемента строки-источника, адресуемого регистром SI, в элемент строки-приемника, адресуемого регистром DI. Содержимое регистров SI и DI изменяется (уменьшается или увеличивается в соответствии со значением флага DF ) на 1 для MOVSB или на 2 для MOVSW с тем, чтобы они указывали на следующие элементы строк. Использование этих инструкций полезно в том случае, когда Ассемблер не может определить атрибуты строк, например, при пересылке участка программного кода. Эти инструкции могут повторяться при использовании соответствующих префиксов.

LODS источник

Загрузка строки байтов или слов. Инструкция LODS загружает элемент строки-источника (байт или слово в зависимости от типа операнда), адресуемый регистром SI, в регистр AL или AX соответственно и устанавливает SI указывающим на следующий элемент строки. Обычно эта инструкция не повторяется, так как каждое повторение замещало бы содержимое регистров AL или AX, и сохранялось бы только последнее значение.

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

LODSB/LODSW

Загрузка строки байтов или слов. Работа этих инструкций аналогична LODS с той лишь разницей, что здесь длина элемента строки задана явно: 1 байт для LODSB и 2 байта для LODSW.

STOS приемник

Сохранение строки байтов или слов. Инструкция STOS помещает содержимое регистров AL или AX (в зависимости от типа операнда) в элемент строки-приемника, адресуемый регистром DI, и устанавливает регистр DI указывающим на следующий элемент строки. Как повторяемая инструкция STOS является традиционным средством для заполнения строки каким-либо значением.

STOSB/STOSW

Сохранение строки байтов или слов. Работа этих инструкций аналогична STOS с той лишь разницей, что здесь длина элемента строки задана явно: 1 байт для STOSB и 2 байта для STOSW.

Сравнение строк

CMPS приемник, источник

Сравнение строки байтов или слов. Инструкция CMPS вычитает байт или слово строки-приемника, адресуемые регистром DI, из байта или слова строки-источника, адресуемых регистром SI. Величина элементов строк определяется Ассемблером путем анализа атрибутов операндов инструкции. CMPS не изменяет содержимое самих строк, но устанавливает флаги AF, CF, OF, PF, SF и ZF таким образом, что они отражают отношение элемента строки-приемника к элементу строки-источника. Если инструкция CMPS использована с префиксом REPE или REPZ, выполняется операция «сравнение до конца строки (пока в CX не 0) и пока строки равны ( ZF=1 )». Если CMPS использована с префиксом REPNE или REPNZ, выполняется операция «сравнение до конца строки (пока в CX не 0) и пока строки не равны ( ZF=0 )». Таким образом, инструкция CMPS может применяться для поиска совпадающих или несовпадающих элементов строк.

CMPSB/CMPSW

Сравнение строки байтов или слов. Работа этих инструкций аналогична CMPS с той лишь разницей, что здесь длина элемента строк задана явно: 1 байт для CMPSB и 2 байта для CMPSW.

Сканирование

SCAS приемник


Поделиться:



Популярное:

Последнее изменение этой страницы: 2017-03-08; Просмотров: 665; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.113 с.)
Главная | Случайная страница | Обратная связь