ВІКІСТОРІНКА
Навигация:
Інформатика
Історія
Автоматизація
Адміністрування
Антропологія
Архітектура
Біологія
Будівництво
Бухгалтерія
Військова наука
Виробництво
Географія
Геологія
Господарство
Демографія
Екологія
Економіка
Електроніка
Енергетика
Журналістика
Кінематографія
Комп'ютеризація
Креслення
Кулінарія
Культура
Культура
Лінгвістика
Література
Лексикологія
Логіка
Маркетинг
Математика
Медицина
Менеджмент
Металургія
Метрологія
Мистецтво
Музика
Наукознавство
Освіта
Охорона Праці
Підприємництво
Педагогіка
Поліграфія
Право
Приладобудування
Програмування
Психологія
Радіозв'язок
Релігія
Риторика
Соціологія
Спорт
Стандартизація
Статистика
Технології
Торгівля
Транспорт
Фізіологія
Фізика
Філософія
Фінанси
Фармакологія


Команды, выполняющие логические операции

К командам, выполняющим логические операции, относятся AND, OR и XOR. Указанные команды выполняют соответственно операции «логическое умножение» (конъюнкцию), «логическое сложение» (дизъюнкцию) и «исключающее или» для двух операндов и помещают результат на место первого операнда. К группе логических команд также относится команда TEST, которая производит те же действия, что и команда AND, но не изменяет своих операндов, а лишь устанавливает соответствующие флаги.

 

 

AND BL,100

TEST CX,DX

OR DX,Mask

XOR Flag,1000b

Команды, выполняющие операции сдвигов

Команды сдвига перемещает все биты в поле данных либо вправо, либо влево, работая либо с байтами, либо со словами. Каждая команда содержит два операнда: первый операнд – поле данных – может быть либо регистром, либо ячейкой памяти; второй операнд – счетчик сдвигов. Его значение может быть равным 1, или быть произвольным. В последнем случае это значение необходимо занести в регистр CL, который указывается в команде сдвига. Число в CL может быть в пределах 0-255. Общая черта всех команд сдвига – установка флага переноса. Бит, попадающий за пределы операнда, сохраняется во флаге переноса. Всего существует 8 команд сдвига: 4 команды обычного сдвига и 4 команды циклического сдвига. Команды циклического сдвига переносят появляющийся в конце операнда бит в другой конец, а в случае обычного сдвига этот бит пропадает. Значение, вдвигаемое в операнд, зависит от типа сдвига. При логическом сдвиге вдвигаемый бит всегда 0, арифметический сдвиг выбирает вдвигаемый бит таким образом, чтобы сохранить знак операнда. Команды циклического сдвига с переносом и без него отличаются трактовкой флага переноса. Первые рассматривают его как дополнительный 9-ый или 17-ый бит в операции сдвига, а вторые нет.

Ниже приведен перечень команд сдвига:

- команды логического сдвига вправо SHR и влево SHL;

- команды арифметического сдвига вправо SAR и влево SAL;

- команды циклического сдвига вправо ROR и влево ROL;

- команды циклического сдвига вправо RCR и влево RCL с переносом.

SHL CH,1

SHL [BP],CL

RCL Size,1

 

 

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

Безусловный переход – это переход, который передает управление без сохранения информации возврата всякий раз, когда выполняется. Ему соответствует команда JMP. Если заранее известно, что переход вперед делается на место, лежащее в диапазоне 128 байт от текущего места, можно использовать команду JMP SHORT LABEL. Атрибут SHORT заставляет Ассемблер сформировать короткую форму команды перехода, даже если он еще не встретил метку LABEL.

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

- проверяющие результаты предыдущей арифметической или логической операции Jcc;

- управляющие итерациями фрагмента программы (организация циклов) LOOPcc.

Все условные переходы имеют однобайтовое смещение, то есть метка, на которую происходит переход должна находится в том же кодовом сегменте и на расстоянии, не превышающем –128 +127 байт от первого байта следующей команды. Если условный переход осуществляется на место, находящееся дальше 128 байт, то вместо недопустимой команды

 

JZ ZERO

 

необходимо использовать специальные конструкции типа:

 

JNZ CONTINUE

JMP ZERO

CONTINUE:

 

Первая группа команд Jcc (кроме JCXZ/JECXZ) проверяет текущее состояние регистра флагов (не изменяя его) и в случае соблюдения условия осуществляет переход на смещение, указанное в качестве операнда. Флаги, проверяемые командой, кодируются в ее мнемонике, например: JC – переход, если установлен CF. Сокращения «L» (less – меньше) и «G» (greater – больше) применяются для целых со знаком, а «A» (above – над) и «B» (below – под) для целых без знака.

Буква Х в любой позиции означает, что команда не проверяет флаг. Цифра 0 означает, что флаг должен быть сброшен, а цифра 1 означает, что флаг должен быть установлен, чтобы условие было выполнено (переход произошел).

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

1) непосредственно проверяющие один из флагов на равенство нулю или единице;

2) арифметические сравнения со знаком. Существуют четыре условия, которые могут быть проверены: меньше (JL), меньше или равно (JLE), больше (JG), больше или равно (JGE). Эти команды проверяют одновременно три флага: знака, переполнения и нуля;

3) арифметические без знака. Здесь также существует четыре возможных соотношения между операндами. Учитываются только два флага: флаг переноса показывает какое из двух чисел больше, флаг нуля определяет равенство.

Таблица 8.1.

Команды условного перехода.

Мнемоника Флаги Комментарии
OF CF ZF PF SF
Проверка флагов
JE/JZ X X X X  
JP/JPE X X X X  
JO X X X X  
JS X X X X  
JNE/JNZ X X X X  
JNP/JPO X X X X  
JNO X X X X  
JNS X X X X  
Арифметика со знаком
JL/JNGE a X X X b a не равно b (SF<>OF)
JLE/JNG a X X b Z или a не равно b
JNL/JGE a X X X b a равно b
JNLE/JG a X X b не Z и (a равно b)
Арифметика без знака
JB/JNAE/JS X X X X  
JBE/JNA X X X CF или Z
JNB/JGE X X X X  
JNBE/JG X X X не CF или не Z

 

Вторая группа команд условного перехода LOOPcc служит для организации циклов в программах. Все команды цикла используют регистр CX в качестве счетчика цикла. Простейшая из них – команда LOOP. Она уменьшает содержимое CX на 1 и передает управление на указанную метку, если содержимое CX не равно 0. Если вычитание единицы из CX привело к нулевому результату, выполняется команда, следующая за LOOP.

Команда LOOPNE (цикл пока не равно) осуществляет выход из цикла, если установлен флаг нуля или если регистр CX достиг нуля. Команда LOOPE (цикл пока равно) выполняет обратную к описанной выше проверку флага нуля: в этом случае цикл завершается, если регистр CX достиг нуля или если не установлен флаг нуля.

Приведенный ниже фрагмент программы иллюстрирует использование команд организации циклов.

 

DSEG SEGMENT

BUF DB “0123406789”

DSEG ENDS

CSEG SEGMENT

ASSUME CS:CSEG,DS:DSEG,SS:SSEG

START:

...

MOV BX,OFFSET BUF;В BX – начало буферов

MOV CX,10 ;В CX – длинна буфера

MOV SI,0

M1: MOV DL,[BX+SI] ;В DL – символ из буфера

MOV AH,2 ;в AH номер функции-вывода

INT 21H ;Вывод на экран

INC SI ;Увеличение индекса на 1

LOOP M1 ;Оператор первого цикла

...

CSEG ENDS

END START

Подпрограммы и прерывания

Язык программирования Ассемблера поддерживает применение процедур двух типов – ближнего (near) и дальнего (far).

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

При вызове процедуры в стеке сохраняется адрес возврата в вызывающую программу:

- при вызове ближней процедуры – слово, содержащее смещение точки вызова относительно текущего кодового сегмента;

- при вызове дальней процедуры – слово, содержащее адрес сегмента, в котором расположена точка возврата, и слово, содержащее смещение точки возврата в этом сегменте.

 

имя_процедуры PROC параметр

тело_процедуры

имя_процедуры ENDP

 

Параметр, указываемый после ключевого слова PROC, определяет тип процедуры: ближний (NEAR) или дальний (FAR).

Передавать фактические параметры процедуре можно несколькими способами. Простейший способ – передача параметров через регистры: основная программа записывает параметры в какие-либо регистры, а процедура по мере необходимости извлекает их из этих регистров и использует в своей работе. Такой способ имеет один основной недостаток: передавать параметры через регистры можно если их немного (если много, то просто не хватит регистров). Решить это проблему можно, передавая параметры через стек. В этом случае основная программа записывает параметры в стек и вызывает подпрограмму, подпрограмма работает с параметрами и, возвращая управление, очищает стек (см. пример в разделе «5.5. Команды работы со стеком»).

Для работы с подпрограммами в систему команд процессора включены специальные команды, это вызов подпрограммы CALL и возврат управления RET.

Все возвраты RET являются косвенными переходами, поскольку извлекают адрес перехода из вершины стека. Внутрисегментный возврат извлекает из стека одно слово и помещает его в регистр IP, а межсегментный возврат извлекает из стека два слова, помещая слова из меньшего адреса в регистр IP, а слово из большего адреса – в регистр CS.

Другим видом процедур являются прерывания DOS и BIOS. Прерывания – это обычные процедуры, написанные разработчиками операционной системы (прерывания DOS) или разработчиками аппаратных средств компьютера (прерывания BIOS). Поэтому к этим процедурам можно обращаться точно так же, как и к другим процедурам. Отличает их лишь форма вызова: вместо команды CALL ProcName используется команда типа INT Number, где Number – номер прерывания, например INT 10h, INT 21h и т.п. Эта команда вызывает прерывание с номером Number (0< Number <255), то есть после такой команды начинает работать подпрограмма обработки прерывания, начальный адрес которой записан в Number-ом элементе таблицы векторов прерываний (таблица векторов прерываний представляет собой массив из 256 элементов, расположенный по адресу 0000:0000 и имеющий длину 1024 байт, каждый элемент таблицы векторов занимает четыре байта и представляет собой начальный адрес процедуры обработки прерывания). Закончив свое выполнение, подпрограмма передает управление на команду расположенную непосредственно за командой INT.

В связи с тем, что в состав операционной системы входит много стандартных процедур и для них не хватает допустимых векторов прерываний, они (процедуры) объединяются в группы, вызываемые по прерыванию с одним и тем же номером. Подпрограммы одной группы называют функциями прерывания. Чтобы различать функции прерывания перед его вызовом в регистр AH заносится номер необходимой функции:

 

MOV AH,номер_функции

INT номер_прерывания

 

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

Ниже приведен пример использования функции 02 прерывания 21H для вывода символа на экран.

 

...

MOV AH,02h ;AH – номер функции

MOV DL,’a’ ;DL – выводимый символ

INT 21h ;инициализация прерывания

...

Команды работы со строками

Каждая строковая операция представлена в процессоре двумя командами: одна предназначена для обработки строк состоящих из байт, другая – из слов (их мнемоника различается наличием буквы B (byte) или W (word)).

Если флаг направления DF перед выполнением команды строковой обработки установлен в 0 (выполнена команда CLD), значение в индексном регистре автоматически увеличивается, если в 1 (выполнена STD) – уменьшается. Индексные регистры уменьшаются или увеличиваются на единицу, если команды работают с байтами, или на 2 – если со словами.

© 2013 wikipage.com.ua - Дякуємо за посилання на wikipage.com.ua | Контакти