Сводка арифметических команд, команд перехода и циклов. Сводка неполная, не описывает всех особенностей команд, не указано изменение флагов. Смотрите подробности в справочнике (например, здесь).
Команда
|
Особенности
|
Пример
|
||||||||||||||||||||||||||
Команда пересылки MOV
MOV <операнд1>,
<операнд2>
|
-команда пересылает
значение одного операнда в другой
Где <операнд2>
-источник, <операнд1> -получатель
Нельзя:
осуществить пересылку непосредственно
из одной области памяти в другую, т.е. Операнды m/m запрещены;
|
mov eax, ebx
mov eax, 0ffffh
mov x, 0
mov eax, x
mov y, eax
|
||||||||||||||||||||||||||
Команда обмена XCHG
XCHG <операнд1>,
<операнд2>
|
Каждый из операндов может
быть регистром или ячейкой памяти.
Нельзя:
осуществить обмен
непосредственно из одной области памяти в другую, т.е. Операнды m/m
запрещены;
|
Обмен значений переменных
mov eax, x
XCHG eax,y
mov x, eax
|
||||||||||||||||||||||||||
Команда сложения
ADD (операнд
назначения),(операнд-источник)
|
Сумма двух операндов,
которые могут быть байтами или словами, помещается в операнд назначения.
Размеры операндов должны
быть одинаковыми, и только один операнд может быть операндом памяти.
|
a dd 45d
b dd -32d
c dd ?
mov eax,
a add eax,
b mov
c, eax
|
||||||||||||||||||||||||||
Команда вычитания
SUB <операнд1>,
<операнд2>
|
Команда SUB вычитает из
первого операнда второй и записывает полученную разность на место первого
операнда.
|
SUB AL,12h
SUB Count,1 SUB BX,4 SUB AX,BX |
||||||||||||||||||||||||||
команда изменения знака:
NEG <операнд>
|
neg ax
|
|||||||||||||||||||||||||||
Команда
инкремента INC <операнд>
|
увеличивает на 1 свой
операнд. Операндом может быть регистр или ячейка памяти любого размера.
|
inc eax
|
||||||||||||||||||||||||||
Команда декремента
DEC <операнд>
|
уменьшает на 1 свой
операнд. Операндом может быть регистр или ячейка памяти любого размера.
|
Dec x
|
||||||||||||||||||||||||||
Команда беззнакового умножения :
MUL <операнд>
|
Операнд–сомножитель, может быть
регистром или ячейкой памяти, но не может быть непосредственным операндом.
Местонахождение второго сомножителя и результата фиксировано: второй
сомножитель берётся из регистра EAX, а результат помещается туда же.
|
mov b, 256
mov
a, 105
mov
eax,a
mul b
|
||||||||||||||||||||||||||
Команда IMUL для
умножения со знаком:
1: IMUL <операнд>
2: IMUL <операнд>,
<непосредственный операнд>
3: IMUL <операнд1>,
<операнд2>, <непосредственный операнд>
4: IMUL <операнд1>,
<операнд2>
|
1:один из сомножителей
указывается в команде, второй должен находиться в регистре EAX/AX/AL, а
результат помещается в регистры EDX:EAX
2: позволяет указать
регистр, который будет содержать один из сомножителей. В этот же регистр
будет помещён результат. Второй сомножитель указывается непосредственно в
команде
3: позволяет указать и
результат, и оба сомножителя. Однако результат может быть помещён только в регистр,
а второй сомножитель может быть только непосредственным операндом. Первый
сомножитель может быть регистром или ячейкой памяти.
4: позволяет указать оба
сомножителя. Первый должен быть регистром, а второй – регистром или ячейкой
памяти. Результат помещается в регистр, являющийся первым операндом
|
imul edx,a,100
imul ebx,a
imul
a
imul
ebx
|
||||||||||||||||||||||||||
Команды деления
DIV <операнд> ;
Беззнаковое деление
IDIV <операнд> ;
Знаковое деление
|
В командах указывается
только один операнд – делитель, который может быть регистром или ячейкой
памяти, но не может быть непосредственным операндом.
Местоположение
делимого и результата для команд деления фиксировано: делимое берётся из
регистра EAX; частное помещается в
регистр EAX; остаток – в регистр EDX.
|
mov edx,0
mov a,127
mov b, -5
mov eax, a
mov ebx, b
idiv ebx
|
||||||||||||||||||||||||||
Команда безусловного
перехода
JMP <операнд>
|
Операнд указывает адрес
перехода.
Два способа перехода:
прямой переход (на метку); косвенный
переход (по адресу, который находится в регистре или ячейке памяти)
|
jmp L2
L1: mov eax, у1
L2: mov eax, x
|
||||||||||||||||||||||||||
Команды сравнения и
условного перехода
CMP <операнд1>,
<операнд2>
Команды условного перехода
Jxx <метка>
|
Последовательное выполнение
соответствует оператору
If (сравнение op1, op2)goto
metka
|
Максимальное
из двух
mov eax,a
cmp eax, b
jge L ;
mov eax, b
L: mov c,eax
|
||||||||||||||||||||||||||
Команда перехода по
состоянию флага
Jxx <метка>
|
|
mov a,10
mov b,32702
mov dx, 0
mov ax, a
mul ax
jc ERROR ; переход, если перенос
;в старший разряд
add ax, b
jo ERROR ; переход,
если ;переполнение
mov c, ax
jmp Lend ERROR:
mov dx, 1
Lend: mov c1,dx
|
||||||||||||||||||||||||||
Команда управления
циклом LOOP
mov ecx, n
L: ... ...
loop L
|
Команда
LOOP требует, чтобы в качестве счётчика цикла использовался регистр ECX.
Исполнение
команды: при дстижении loop L, из регистра ECX вычитается 1, сравнивается с
нулём , если значение в регистре ECX больше 0 то осуществляет переход на
метку L .
LOOP
реализует цикл с постусловием, следовательно, тело цикла выполняется хотя бы
один раз.
Если
до начала цикла в регистре ECX находится значение 0, то при вычитании
единицы, которое выполняется до сравнения с нулём, в регистре ECX окажется
ненулевое значение, и цикл будет выполняться 2^32 раз.
|
; a=0 do a=cумма нечетных чисел while (a<c)
mov edx,0
mov eax,c
mov ebx,2
div ebx
mov ecx,eax
mov eax,0
mov ebx,1
L: imul ebx,ecx,2
sub ebx,1
add eax,ebx
loop L
mov a,ebx
mov c,eax
|
||||||||||||||||||||||||||
Команда управления
циклом с досрочным выходом (LOOPE,
LOOPNE)
LOOPE <метка>
|
Эти команды похожи на
команду LOOP, но позволяют также организовать и досрочный выход из цикла.
В регистр ECX записывают
число повторений цикла.
Команда LOOPE (LOOPZ)
ставится в конце цикла, а перед ней помещается команда, которая меняет флаг
ZF (обычно это команда сравнения CMP)
цикл повторяется ECX раз,
если сравниваемые величины равны (вырабатывает нулевой результат, т.е.
ZF = 1).
LOOPNE выполняется также, но для ZF = 0
|
; является ли с простым
mov edx,0
mov eax,c
mov ebx,2
div ebx
mov ecx,eax
mov eax,c
mov ebx,0
L:
mov edx,0
mov eax,c
div ecx
cmp edx,0
loopne L
cmp ecx,0
jne L1
mov ebx,1
L1:mov b,ebx
add ecx,1
mov c,ecx
|
||||||||||||||||||||||||||
Комментариев нет:
Отправить комментарий