Команды двоичной арифметики, синтаксис команд
Программирование арифметических выражений в языке Ассемблер происходит через некоторые команды такие, как: mul, div, sub, add. Эти команды называются командами арифметических операций.
Add – команда сложения. Слаживает два числа. Результат заносится в первый регистр.
Adc – сложение с переносом
XAdd – обменять между собой и сложить
Синтаксис: Add приемник, источник
Sub – команда вычитания. Вычитает два числа. Результат заносится в первый регистр.
Sbb – вычитание с займом
Синтаксис: Sub приемник, источник
Mul – команда умножения без учета знака. Она умножает регистр ax на то, что стоит после нее.
IMul – умножение со знаком
Синтаксис: MUL источник
Div – команда деления без учета знака. Она делит регистр ax на то, что стоит после нее..
IDiv - деление со знаком
Синтаксис:
inc - вызывают инкременты. Увеличивает на 1.
dec - декремент, уменьшает на 1
Синтаксис: INC приемник
NEG - Изменение знака
Синтаксис: NEG приемник
CMP - Сравнение
Синтаксис: CMP приемник, источник
Команды логических операций, синтаксис команд.
Эти команды, точно так же, как и арифметические команды, преобразуют данные, но делают это не арифметически. Логические команды работают со значениями 0 и 1, которые использует ЭВМ.
Четырьмя основными логическими командами являются AND (и), OR (или), XOR (исключающее или), NOT (не). Эти четыре команды работают непосредственно с нулями и единицами двоичного кода.
Простейшая функция выполняется командой NOT. Эта команда основывается на определении единицы и нуля, как истины (TRUE) и лжи (FALSE) соответственно.
Действие логических команд:
X | Y | X AND Y | X OR Y | X XOR Y |
Знач. | NOT |
Синтаксис:
NOT <операнд> (логическое умножение)
AND <операнд1>, <операнд2> (логическое сложение)
OR <операнд1>, <операнд2> (выполняет сложение по модулю 2 )
XOR <операнд1>, <операнд2>
Сдвиговые операции:
· Команда: | SARприемник, счетчик |
· Назначение: | Арифметический сдвиг вправо |
· Команда: | SALприемник, счетчик |
· Назначение: | Арифметический сдвиг влево |
· Команда: | SHRприемник, счетчик |
· Назначение: | Логический сдвиг вправо |
· Команда: | SHLприемник, счетчик |
· Назначение: | Логический сдвиг влево |
Общий вид строк программ на языке ассемблера.
Строка имеет следующий синтаксический вид:
метка команда/директива операнд(ы) ;комментарии
Все поля не обязательны. Метка может быть любой комбинацией английских букв и символов. Второе поле содержит команды процессора, транспортируемые в исполняемый код или директиву управляющую работой ассемблера. Если команду или директиву необходимо продолжить на следующей строке, то используется символ обратный слеш: \.
По умолчанию язык ассемблера не различает заглавные и строчные буквы в написании команд или директив.
Метка: назначение, синтаксис, правила именования, директива метки, вызов метки
Метка в языке ассемблера может содержать следующие символы:
· все буквы латинского алфавита;
· цифры от 0 до 9;
· спецсимволы: _, @, $, ?.
В качестве первого символа метки может использоваться точка, но некоторые компиляторы не рекомендуют применять этот знак. В качестве меток нельзя использовать зарезервированные имена Ассемблера (директивы, операторы, имена команд).
Первым символом в метке должна быть буква или спецсимвол (но не цифра). Максимальная длина метки – 31 символ. Все метки, которые записываются в строке, не содержащей директиву ассемблера, должны заканчиваться двоеточием :. Когда метка стоит перед директивой ассемблера, она оказывается операндом этой директивы.
Директивы, работающие напрямую с метками: LABEL, EQU и =.
Директива LABEL определяет метку и задает ее тип. Тип может быть одним из:
· BYTE (байт),
· WORD (слово),
· DWORD (двойное слово),
· FWORD (6 байт),
· QWORD (учетверенное слово),
· TBYTE (10 байт),
· NEAR (ближняя метка),
· FAR (дальняя метка).
Метка получает значение, равное адресу следующей команды или следующих данных, и тип, указанный явно.
В зависимости от типа команда mov метка,0 запишет в память байт , заполненный нулями, а команда call метка выполнит ближний или дальний вызов подпрограммы.
Директива EQU присваивает метке значение, которое определяется как результат целочисленного выражения в правой части.
Метка = выражение
Специальные предопределенные метки:
· @date или ??date - это может быть текущая дата
· @cpu - тип процессора
· $ - текущий адрес
Псевдокоманды
Псевдокоманда— это директива ассемблера, которая приводит к включению данных или кода в программу, хотя сама она никакой команде процессора не соответствует. Псевдокоманды определения переменных указывают ассемблеру, что в соответствующем месте программы располагается переменная, определяют тип переменной (байт, слово, вещественное число и т.д.), задают ее начальное значение и ставят в соответствие переменной метку, которая будет использоваться для обращения к этим данным. Псевдокоманды определения данных записываются в общем виде следующим образом:
имя_переменной d* значение
где D* — одна из нижеприведенных псевдокоманд:
DB — определить байт;
DW — определить слово (2 байта);
DD — определить двойное слово (4 байта);
DF — определить 6 байт (адрес в формате 16-битный селектор: 32-битное смещение);
DQ — определить учетверенное слово (8 байт);
DT — определить 10 байт (80-битные типы данных, используемые FPU).
Поле значения может содержать одно или несколько чисел, строк символо, операторов ? и DUP, разделенных запятыми. Например:
text_string db 'Hello world!'
number dw 7
Если вместо точного значения указан знак ?, переменная считается неинициализированной и ее значение на момент запуска программы может оказаться любым.
Если нужно заполнить участок памяти повторяющимися данными, используется специальный оператор DUP.