Основные непривилегированные команды процессора

Download Report

Transcript Основные непривилегированные команды процессора

ОСНОВНЫЕ
НЕПРИВИЛЕГИРОВАННЫЕ
КОМАНДЫ ПРОЦЕССОРА
Микропроцессоры и микропроцессорные системы
Основные непривилегированные команды
1. Пересылка данных
MOV приемник, источник
- Пересылка данных
Базовая команда пересылки данных. Копирует содержимое источника
в приемник, источник не изменяется.
Пример. mov ax, bx
PUSH источник
- Поместить данные в стек
Помещает содержимое источника в стек. Источником может быть
регистр, сегментный регистр, непосредственный операнд или
переменная. Уменьшает ESP на размер источника (2 или 4). Команда
PUSH почти всегда используется в паре с РОР (считать данные из
стека). Поэтому, чтобы скопировать содержимое одного сегментного
регистра в другой (что нельзя выполнить одной командой МОV),
можно использовать такую последовательность команд:
push cs
рор ds ; теперь DS указывает на тот же сегмент, что и CS
POP приемник
- Считать данные из стека
Помещает в приемник слово или двойное слово, находящееся в вершине стека,
увеличивая ESP на 2 или 4 соответственно. POP выполняет действие обратное
PUSH. Приемником может быть регистр общего назначения, сегментный
регистр, кроме CS.
IN приемник, источник
- Считать данные из порта
Копирует число из порта ввода-вывода, номер которого указан в источнике, в
приемник. Приемником может быть только AL, АХ или ЕАХ. Источник - или
непосредственный операнд, или DХ, причем во время использования
непосредственного операнда можно указывать лишь номера портов не больше
255.
OUT приемник, источник
- Записать данные в порт
Копирует число из источника (AL, АХ или ЕАХ) в порт ввода-вывода, номер ,
которого указан в приемнике. Приемник может быть либо непосредственным
номером порта (не больше 255), либо регистром DX. На командах IN и OUT
строится все общение процессора с устройствами ввода-вывода - клавиатурой,
жесткими дисками, различными контроллерами, и используются они, в первую
очередь, в драйверах устройств. Например, чтобы включить динамик PC,
достаточно выполнить команды:
in a1, 61h
or а1, 3
out 61h, al
2. Команды двоичной арифметики
ADD приемник, ИСТОЧНИК
- Сложение
Команда выполняет арифметическое сложение приемника и источника,
помещает сумму в приемник, не изменяя содержимое источника. Приемник
может быть регистром или переменной, источник - числом, регистром или
переменной, но нельзя использовать переменную одновременно и для
источника, и для приемника. Команда ADD никак не различает числа со
знаком и без знака, но, употребляя значения флагов СF (перенос при
сложении чисел без знака), ОF (перенос при сложении чисел со знаком) и SF
(знак результата), разрешается применять ее и для тех, и для других.
SUB приемник, источник
- Вычитание
Вычитает источник из приемника и помещает разность в приемник.
Приемник может быть регистром или переменной, источник - числом,
регистром или переменной, но нельзя использовать переменную
одновременно и для источника, и для приемника. Точно так же, как и
команда ADD, SUB не делает различий между числами со знаком и без знака,
но флаги позволяют Использовать ее и для тех, и для других.
MUL источник
- Умножение чисел без знака
Выполняет умножение содержимого источника (регистр или переменная) и
регистра AL, АХ, ЕАХ (в зависимости от размера источника) и помещает
результат в АХ, DX:AX, EDX:EAX соответственно. Если старшая половина
результата (АН, DX, EDX) содержит только нули (результат целиком
поместился в младшую половину), флаги CF и OF устанавливаются в 0,
иначе - в 1. Значение остальных флагов (SF, ZF, АF и PF) не определено.
DIV источник
- Целочисленное деление без знака
Выполняет целочисленное деление без знака AL, АХ или ЕАХ
(в зависимости от размера источника) на источник (регистр или переменная)
и помещает результат в AL, АХ или ЕАХ, а остаток - в АН, DX или EDX
соответственно. Результат всегда округляется в сторону нуля, абсолютное
значение остатка меньше абсолютного значения делителя. Флаги СF, OF, SF,
ZF, AF и PF после этой команды не определены, а переполнение или деление
на ноль вызывает исключение #DE (ошибка при делении) в защищенном
режиме и прерывание 0 - в реальном.
INC
приемник
- Инкремент
Увеличивает приемник (регистр или переменная) на 1. Единственное
отличие этой команды от ADD приемник,1 состоит в том, что флаг СF не
затрагивается. Остальные арифметические флаги (OF, SF, ZF, AF, PF)
устанавливаются в соответствии с результатом сложения.
DEC приемник
- Декремент
Уменьшает приемник (регистр или переменная) на 1. Единственное отличие
этой команды от SUB приемник,1 заключается в том, что флаг CF не
затрагивается. Остальные арифметические флаги (OF, SF, ZF, АР, PF)
устанавливаются в соответствии с результатом вычитания.
CMP
приемник, источник
- Сравнение
Сравнивает приемник и источник и устанавливает флаги, Действие
осушествляется путем вычитания источника (число, регистр или
переменная) из приёмника (регистр или переменная; приемник и источник
не могут быть переменными одновременно), причем результат вычитания
никуда не записывается. Единственным следствием работы этой команды
оказывается изменение флагов CF, OF, SF, ZF, AF и РF. Обычно команду
СМР используют вместе с командами условного перехода (Jсс) и другими,
которые позволяют применить результат сравнения, не обращая внимания
на детальное значение каждого флажка.
3. Логические операции
AND
приемник, источник
- Логическое И
Команда выполняет побитовое «логическое И» над приемником (регистр или
переменная) и источником (число, регистр или переменная: источник и
приемник не могут быть переменными одновременно) и помещает результат в
приемник. Любой бит результата равен 1, только если соответствующие биты
обоих операндов были равны 1, и равен 0 в остальных случаях. Наиболее часто
AND применяют для выборочного обнуления отдельных битов. Например,
команда
аnd
al, 00001111b
06нулит старшие четыре бита регистра AL, сохранив неизменными четыре
младших. Флаги OF и CF обнуляются, SF, ZF и PF устанавливаются в
соответствии с результатом, AF не определен.
OR приемник, источник
-
Логическое ИЛИ
Выполняет побитовое «логическое ИЛИ» над приемником (регистр или
переменная) и источником (число, регистр или переменная; источник и
приемник не могут быть переменными одновременно) и помещает результат в
приемник. Любой бит результата равен 0, только если соответствующие биты
обоих операндов были равны 0, и равен 1 в остальных случаях. Команду OR
чаще всего используют для выборочной установки отдельных битов. Например,
команда
or
al, 00001111b
приведет к тому, что младшие четыре бита регистра AL будут установлены в 1.
При выполнении команды OR флаги OF и CF обнуляются, SF, ZF и PF
устанавливаются в соответствии с результатом, AF не определен.
ХОR
приемник, источник
- Логическое исключающее ИЛИ
Выполняет побитовое «логическое исключающее ИЛИ» над приемником
(регистр или переменная) и источником (число, регистр или переменная:
источник и приемник не могут быть переменными одновременно) и помещает
результат в приемник. Любой бит результата равен 1, если соответствующие
биты операндов различны, и нулю - в противном случае. XОR используется для
самых разных операций, например:
хоr ах, ах
; Обнуление регистра АХ.
хоr ах, Ьх
хоr bx, ах
хоr ах, Ьх
; Меняет местами содержимое АХ и. ВХ.
или
Оба примера могут выполняться быстрее, чем команда :
NОТ
mov ах, 0
приемник
Инверсия
-
Каждый бит приемника (регистр или переменная), равный нулю,
устанавливается в 1, и каждый бит, равный 1, сбрасывается в 0. Флаги не
затрагиваются.
TEST
приемник, источник
-
Логическое сравнение
Вычисляет результат действия побитового «логического И» над приемником
(регистр или переменная) и источником и устанавливает флаги SF, ZF и PF в
соответствии с полученным показателем, не сохраняя результата . TEST, так же
как и СМР, используется в основном в сочетании с командами условного
перехода (Jсс).
4. Команды передачи управления
JMP
операнд
- Безусловный переход
JMP передает управление в другую точку программы, не сохраняя какойлибо информации для возврата. Операндом может быть непосредственный
адрес для перехода (В программах используют имя метки, установленной
перед командой, на которую выполняется переход), а также регистр или
переменная, содержащая адрес. В зависимости от типа перехода различают:
 переход типа shоrt (короткий переход) - если адрес перехода находится в
пределах -128 ... +127 байт от команды JМР;
 переход типа near (ближний переход) - если адрес перехода находится в том
же сегменте памяти, что и команда JМР;
о переход типа far (дальний переход) - если адрес перехода находится в
другом сегменте. Дальний переход может выполняться и в тот же самый
сегмент при условии, что в сегментной части операнда указа но число,
совпадающее с текущим значением CS;
При выполнении переходов типа short и пеаг команда JMР фактически
преобразовывает значение регистра EIP (или IP), изменяя тем самым
смещение следующей исполняемой команды относительно начала сегмента
кода.
Jcc
метка
- Условный переход
Это набор команд, выполняющих
переход (типа short или nеаг),
если удовлетворяется
соответствующее условие,
которым в каждом случае
реально является состояние тех
или иных флагов. Но, когда
команда из набора Jсс
используется сразу после СМР,
условия приобретают
формулировки, соответствующие
отношениям между операндами
СМР . Например, если операнды
СМР были равны, то команда JE,
выполненная сразу после СМР,
осуществит переход. Операнд для
всех команд из набора Jсс - 8битное или 32-битное смещение
относительно текущей команды.
Пример.
cmp ax, 0
je
local_1 ; переход, если ax=0
jmp far_tabel
local_1:
…
far_table:
…
LOOP метка
- Цикл
Уменьшает регистр СХ (ECX) на 1 и выполняет переход типа short на
метку (которая не может быть дальше расстояния -128 ... +127 байт от
команды LOOP), если CX (ЕСХ) не равен нулю. Эта команда
используется для организации циклов, в которых регистр СХ (EСХ)
играет роль счетчика. Так, в следующем фрагменте команда ADD
выполнится 10 раз:
mov
сx, 0Ah
loop_start:
add
аx, cх
lоор
loop_start
Команда LOOP полностью эквивалентна паре команд
dec
cх
jnz
метка ; если не 0
Но LOOP короче этих двух команд на один байт и не изменяет
значения флагов.
LOOPE
метка
- Цикл, пока равно
(ZF=1)
LOOPZ
метка
- Цикл, пока ноль
(ZF=1)
LOOPNE метка
- Цикл, пока не равно (ZF=0)
LOOPNZ метка
- Цикл, пока не ноль
(ZF=0)
Пример.
mov
cx, str_length
move_loop:
lodsb
; чтение байта из строки
stosb
;запись байта в строку
cmр
al, 13
loopnz move_loop
CALL
операнд
-
Вызов процедуры
Сохраняет текущий адрес в стеке и передает управление по адресу,
указанному в операнде. Операндом может быть непосредственное
значение адреса (метка в ассемблерных программах), регистр или
переменная, содержащие адрес перехода. Если в качестве адреса
перехода указано только смещение, считается, что адрес расположен в
том же сегменте, что и команда CALL.
REТ число
- Возврат из процедуры
RЕТN число
RЕТF число
REТN считывает из стека слово (или двойное слово, в зависимости от
режима адресации) и загружает его в IP (или EIP), выполняя тем самым
действия, обратные ближнему вызову процедуры командой CALL. Команда
RETF загружает из стека IP (EIP) и CS, возвращаясь из дальней процедуры.
Если в программе указана команда RET, ассемблер заменит ее на REТN или
RETF в зависимости от того, как была описана процедура, которую эта
команда завершает.
INT
число
- Вызов прерывания
INT аналогично команде CALL помещает в стек содержимое регистров
FLAGS, CS и IP, после чего передает управление программе, называемой
обработчиком прерываний с указанным в качестве операнда номером
(число от 0 до 0FFh). Например, следующий фрагмент кода завершает
выполнение программы и возвращает управление DOS:
mov
ax, 4C01h
int
21h
IREТ
IREТD
- Возврат из обработчика прерывания