ЗАМЕЧАНИЕ В настоящей книге не рассматриваются все команды ассемблера x86 — и тем
более все возможные команды языков ассемблера различных ЭВМ.
В архитектуру x86 введена еще одна весьма полезная команда,
позволяющая двум ячейкам памяти произвести обмен содержимым, —
xchg
. В других системах команд для реализации подобного действия
требуется несколько команд MOV и промежуточный буфер:
xchg
ax,bx; обмен содержимым AX ↔ BX
Перейдем к командам преобразования данных. Это в первую очередь
арифметические операции, а также логические операции и команды
сдвигов. Сложение и вычитание весьма просты:
add
ax,2; прибавление числа 2 к регистру AX
sub
N,-
1; вычитание минус единицы из ячейки с именем N
Существуют две специальные команды для уменьшения (декремента) и
увеличения на единицу (инкремента):
inc
cx; cx=cx+1
dec
N; уменьшение на единицу содержимого ячейки с именем N
Данные команды занимают меньше места в памяти и выполняются
быстрее, нежели sub и add с аргументом 1. В языке программирования
Си очевидна параллель — -- и ++.
Несколько более интересны команды умножения и деления. Во-первых,
система команд x86 предусматривает по две команды для умножения и
деления чисел — со знаком и беззнаковых. Умножение беззнаковых чисел
производится командой mul, чисел со знаком — imul. Во-вторых,
команда одноадресная — по умолчанию один из аргументов берется из
регистра AX и туда же заносится результат. Если результат не умещается в
AX
полностью, старшие биты произведения помещаются в DX. Рассмотрим
пример:
mov
bx,5; первый сомножитель 5 заносим в BX
mov
ax,25 ; второй сомножитель 25 → в AX
mul
bx ; умножаем 5 * 25, результат → в AX
Команда деления беззнаковых чисел — div, чисел со знаком — idiv.
Поскольку аргументы воспринимаются как целые числа, а для них
полноценное математическое деление невозможно, операция производится
как целочисленное деление с занесением неполного частного в младшие
биты регистра AX, которые обозначаются AH, а остатка от деления — в его
старшие биты (AL). При делении чисел размером 1 байт частное заносится
в AL, а остаток — в DL.