пятница, 20 декабря 2013 г.

Маленькая таблица команд ассемблера

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






Команда
Особенности
Пример
Команда пересылки 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
мнемокод
Условие перехода после команды
CMP op1, op2
Примечание
JE
op1 = op2
Для всех чисел
JNE
op1 ≠ op2
JL
op1 < op2
Для чисел со знаком
JLE
op1 ≤ op2
JG
op1 > op2
JGE
op1 ≥ op2
JB
op1 < op2
Для чисел без знака
JBE
op1 ≤ op2
JA
op1 > op2
JAE
op1 ≥ op2
Максимальное
из двух

mov eax,a
cmp eax, b
jge L ;
mov eax, b
L: mov c,eax

Команда перехода по состоянию флага
Jxx <метка> 
Мнемокод
Условие перехода
JZ
ZF = 1
JS
SF = 1
JC
CF = 1
JO
OF = 1
JP
PF = 1
JNZ
ZF = 0
JNS
SF = 0
JNC
CF = 0
JNO
OF = 0
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









Комментариев нет:

Отправить комментарий