Примеры арифметических команд
1. Чтоб сложить содержимое двух регистров, нужно использовать команду
ADD AH,AL
Прибавить к содержимому регистра AH содержимое регистра AL. Результат будет находиться в регистре AH. Здесь ADD обозначает код операции, а AH,AL операнды, которые в нашем примере являются регистрами общего назначения.
2. Чтобы вычесть из значения регистра число, находящееся в другом регистре, нужно использовать команду:
SUB CX,DX
Отнять от CX содержимое DX, результат будет находиться в регистре CX.
Два первых примера иллюстрируют случай, когда оба операнда инструкции являются регистрами.
3. Добавить число к содержимому регистра
ADD AH,9
Добавляем значение 9 к содержимому регистра AH, результат будет находиться в регистре AH. То есть в этом случае приемник это регистр, а источник находится непосредственно в команде. Это пример на использование в качестве операнда конкретного числа.
4. Добавить содержимое, находящееся по известному адресу, к содержимому регистра
ADD AX,[0133h]
Прибавить к содержимому регистра AX байты находящиеся в памяти по адресу 0133h (квадратные скобки указывают что операндом будет адрес).
Команды пересылки данных не требуют выполнения никаких операций над операндами. Операнды просто пересылаются (точнее, копируются) из источника в приемник. Источником и приемником могут быть регистры процессора, ячейки памяти.
Примеры команд пересылки данных
1. Поместить содержимое одного регистра в другой
MOV DX,BX
Копировать содержимое регистра BX в регистр DX.
2. Поместить число по известному адресу
MOV [BX], 5050H
Поместить в память по адресу 0133h значение 5050h. В этом случае операндом источником будет число, находящееся непосредственно в команде, а операндом источником – адрес.
Логические команды выполняют над операндами логические (побитовые) операции (для тех, кто забыл, что такое логические операции, информация по ним приведена в приложении), то есть они рассматривают коды операндов не как единое число, а как набор отдельных битов. Этим они отличаются от арифметических команд. Среди логических команд можно назвать логическое И, логическое ИЛИ, исключающее ИЛИ, очистку, инверсию, разнообразные сдвиги (вправо, влево, арифметический сдвиг, циклический сдвиг). Этим командам, как и арифметическим, требуется один или два входных операнда, и формируют они один выходной операнд.
Пример логической команды
Применить побитовое исключающее или к операндам обозначающий один и тот же регистр:
XOR EAX,EAX
Самый быстрый для процессора способ обнулить регистр EAX (если операнды одинаковые, то на выходе в любом случае будет 0).
Команды переходов предназначены для изменения обычного порядка последовательного выполнения команд. С их помощью организуются переходы на подпрограммы и возвраты из них, всевозможные циклы, ветвления программ, пропуски фрагментов программ и т.д. Команды переходов всегда меняют содержимое счетчика команд. Переходы могут быть условными и безусловными. Именно эти команды позволяют строить сложные алгоритмы обработки информации.
Для того чтобы рассказать, что такое условный переход необходимо предварительно рассказать о регистре состояния процессора (PSW). Иначе этот регистр называют регистром флагов. Он предназначен для отражения текущего состояние процессора. Биты этого регистра устанавливаются или очищаются в соответствии с результатом каждой выполненной команды. Каждый бит регистра состояния имеет свой смысл и называется флагом.
Чаще всего нас интересует флаг нуля (ZF – Zero Flag), который включается, когда в результате действия команды переменная обнуляется. Другим часто используемым флагом является флаг знака (SF – Sign Flag), который показывает что переменная, установленная в результате действия команды, будет положительна. Все арифметические и некоторые другие команды меняют флаги, т.е. мы всегда знаем, что получилось в результате (операнд приемник содержит нуль, положительное или отрицательное число и т.д.)
Вернемся к условным и безусловным переходам.
Команды безусловных переходов вызывают переход в новый адрес независимо ни от чего. Они могут вызывать переход на указанную величину смещения (вперед или назад) или же на указанный адрес памяти. Величина смещения или новое значение адреса указываются в качестве входного операнда.
Команды условных переходов вызывают переход не всегда, а только при выполнении заданных условий. В качестве таких условий обычно выступают значения флагов в регистре состояния процессора (PSW). То есть условием перехода является результат предыдущей операции, меняющей значения флагов. Несколько примеров команд условных переходов:
- переход, если равно нулю;
- переход, если больше нуля;
- переход, если меньше или равно нулю.
Если условие перехода выполняется, то производится загрузка в регистр-счетчик команд нового значения. Если же условие перехода не выполняется, счетчик команд просто наращивается, и процессор выбирает и выполняет следующую по порядку команду