- •Классификация команд процессора Intel.
- •Команды пересылки данных: mov, cmoVcc, xchg, bswap, in, out.
- •Команды пересылки данных: push, pop, pusha, pushad, popa, popad.
- •Команды двоичной арифметики: add, adc, xadd, sub, sbb, inc, dec, neg.
- •Команды двоичной арифметики: imul, mul, idiv, div, cmp, cmpxchg, cmpxchg8b.
- •Команды десятичной арифметики: daa, das, aaa, aas, aam, aad.
- •Команды логических операций: and, or, xor, not, test.
- •Команды сдвиговых операций: sar, sal, shr, shl, shrd, shld.
- •Команды операций над битами и байтами: bt, bts, btr, btc, bsf, bsr, seTcc.
- •Команды сдвиговых операций: ror, rol, rcr, rcl.
- •Команды передачи управления: jmp, Jcc, jcxz, jecxz.
- •Команды передачи управления: loop, loope, loopz, loopne, loopnz.
- •Команды передачи управления: call, ret, retn, retf.
- •Команды передачи управления: int, iret, iretd, int3, into.
- •Префиксы повторения для строковых операций: rep, repe, repne, repz, repnz.
- •Строковые операции: movs, movsb, movsw, movsd, cmps, cmpsb, cmpsw, cmpsd.
- •Строковые операции: stos, stosb, stosw, stosd, ins, insb, insw, insd, outs, outsb, outsw, outsd.
- •Строковые операции: scas, scasb, scasw, scasd, lods, lodsb, lodsw, lodsd.
- •Команды управления флагами: stc, clc, cmc, std, cld, lahf, sahf.
- •Команды управления флагами: pushf, pushfd, popf, popfd, cli, sti, salc.
- •Директивы задания набора допустимых команд. Глобальные объявления.
- •Условное ассемблирование. Выражения. Операторы, используемые в выражениях.
- •Ввод данных с клавиатуры и вывод на экран.
Команды передачи управления: loop, loope, loopz, loopne, loopnz.
Но LOOP короче этих двух команд на один байт и не изменяет значения флагов.
Команда: |
LOOPE метка |
Назначение: |
Цикл, пока равно |
Команда: |
LOOPZ метка |
Назначение: |
Цикл, пока ноль |
Команда: |
LOOPNE метка |
Назначение: |
Цикл, пока не равно |
Команда: |
LOOPNZ метка |
Назначение: |
Цикл, пока не ноль |
Процессор: |
8086 |
Все эти команды уменьшают регистр ЕСХ на один, после чего выполняют переход типа short, если ЕСХ не равен нулю и если выполняется условие. Для команд LOOPE и LOOPZ условием является равенство единице флага ZF, для команд LOOPNE и LOOPNZ — равенство флага ZF нулю. Сами команды LOOPcc не изменяют значений флагов, так что ZF должен быть установлен (или сброшен) предшествующей командой. Например, следующий фрагмент копирует строку из DS:SI в строку в ES:DI (см. описание команд работы со строками), пока не кончится строка (СХ = 0) или пока не встретится символ с ASCII-кодом 13 (конец строки):
mov cx,str_length
move_loop:
stosb
lodsb
cmp al,13
loopnz move_loop
Команды передачи управления: call, ret, retn, retf.
Команда: |
CALL операнд |
Назначение: |
Вызов процедуры |
Процессор: |
8086 |
Сохраняет текущий адрес в стеке и передает управление по адресу, указанному в операнде. Операндом может быть непосредственное значение адреса (метка в ассемблерных программах), регистр или переменная, содержащие адрес перехода. Если в качестве адреса перехода указано только смещение, считается, что адрес расположен в том же сегменте, что и команда CALL. При этом, так же как и в случае с JMP, выполняется ближний вызов процедуры. Процессор помещает значение регистра EIP (IP при 16-битной адресации), соответствующее следующей за CALL команде, в стек и загружает в EIP новое значение, осуществляя тем самым передачу управления. Если операнд CALL — регистр или переменная, то его значение рассматривается как абсолютное смещение, если операнд — метка в программе, то ассемблер указывает ее относительное смещение. Чтобы осуществить дальний CALL в реальном режиме, режиме V86 или в защищенном режиме при переходе в сегмент с теми же привилегиями, процессор помещает в стек значения регистров CS и EIP (IP при 16-битной адресации) и выполняет дальний переход аналогично команде JMP.
Команда: |
RET число RETN число RETF число |
Назначение: |
Возврат из процедуры |
Процессор: |
8086 |
RETN считывает из стека слово (или двойное слово, в зависимости от режима адресации) и загружает его в IP (или EIP), выполняя тем самым действия, обратные ближнему вызову процедуры командой, CALL. RETF соответственно загружает из стека IP (EIP) и CS, возвращаясь из дальней процедуры. Если в ассемблерной программе указана команда RET, ассемблер заменит ее на RETN или RETF в зависимости от того, как была описана процедура, которую эта команда завершает. Операнд для RET необязателен, но, если он присутствует, после считывания адреса возврата из стека будет удалено указанное количество байт — это бывает нужно, если при вызове процедуры ей передавались параметры через стек.
