- •Структура мп ix86 фирмы Intel
- •Регистры общего назначения (регистры данных)
- •Регистры-указатели
- •Регистры сегментов (сегментные регистры)
- •Указатель команд и регистр флагов
- •Сегментация памяти
- •Структура команд мп
- •Формат «Регистр-регистр» (Рг-Рг) – 2 байта
- •Формат «Регистр-память» (Рг-яп) – 2÷4 байта
- •Формат «Регистр-непосредственный операнд» (Рг-но) – 3÷4 байта
- •Формат «Память-непосредственный операнд» (яп-но) – 3÷6 байтов
- •Представление данных в пэвм
- •Целые числа
- •Двоично-десятичные числа (bcd)
- •Символьные данные
- •Вещественные данные
- •Система команд мп семейства iх86 фирмы Intel
- •Команды сложения и вычитания
- •Дополнительные команды
- •Команды умножения и деления
- •Команды преобразования длины
- •Стековые команды
- •Доступ к элементам стека с помощью регистра вр
- •Команды передачи управления
- •Близкие и далекие переходы.
- •Адресация в переходах.
- •Конструкции языка Ассемблера Литература
Дополнительные команды
а) Команда сравнения
CHP op 1, op 2; op 1 - op2
Результат нигде не запоминается.
Цель команды – модификация флагов: ZF, SF,PF,CF,AF,OF.
б) Команда изменения знака
NEG op
Операнд может быть байт или слово в регистре или в ячейке памяти.
Пример,
MOV AH, 12
NEG AH ; AH := -12
Если операнд равен нулю, то его значение не изменяется.
Команда модифицирует флаги аналогично п.(а), причем
CF=1, кроме случая, когда операнд равен нулю;
OF=0, кроме случая, когда op=-128 (для 1Б), тогда OF=1, а операнд остается без изменения.
Команды умножения и деления
а) Умножение
MUL op ; умножение целых чисел без знака
I MUL op; умножение целых чисел со знаком
Операнд может быть слово или байт в регистре или в ячейке памяти, но не непосредственный операнд.
Команды действуют одинаково:
- для байтов AX := AL*op
- для слов (DX,AX) := AX*op
Команда однооперандная, второй операнд находится в аккумуляторе (подразумеваемая адресация).
Т.к. результат получается удвоенной разрядности относительно сомножителей, то при умножении слов он располагается в стандартной паре регистров (DX,AX), причем DX хранит старшие разряды.
Команды модифицируют флаги:
СF=OF=0 , если старшая половина результата AH нулевая или совпадает по знакам.
СF=OF=1 , если старшие разряды не нулевые.
б) Деление
DIV op; деление целых чисел без знака
IDIV op; деление целых чисел со знаковом
где op – аналогично умножению.
Команды выполняют деление нацело и формируют два результата: целое частное и остаток.
Деление слова на байт выполняется по схеме
АН:=АХ mod op (остаток)
AL:=AX div op (частное)
Деление двойного слова на слово
DX := (DX,AX) mod op
AX := (DX,AX) div op
Делимое заранее должно быть размещено в аккумуляторе и сдвинуто в сторону младшего байта в АХ или AL соответственно.
Флаги не модифицируются, но может возникнуть ошибка «деление на ноль или переполнение», которая возникает, если делитель нулевой или частное не помещается в соответствующее ему место.
При появлении этой ошибки микропроцессор прекращает выполнение программы.
в) Команды десятичной коррекции после команд умножения AAM и перед командой деления AAD (разобрать самостоятельно).
Команды преобразования длины
Эти команды используются перед делением, флаги – не модифицируют.
CBW
– преобразует байт со знаком в AL, в слово со знаком в АХ путем распространения старшего бита AL по всем разрядам AH;
CWD
– преобразует слово в АХ в двойное слово в (DX,AX).
Команды побитовой обработки (логические команды)
Данная группа команд отличается отсутствием межразрядных переносов. Команды делятся на 2 группы.
а) Логические команды.
Общие черты:
команды выполняют логические операции над соответствующими разрядами операндов параллельно;
единица трактуется как «истина», ноль – «ложь»;
модифицируют флаги, но важен только флаг ZF «нулевой результат»;
операндами могут быть байты или слова в регистрах или ячейках памяти, второй операнд может быть непосредственным операндом.
Перечислим основные команды
NOT op; отрицание (инверсия кода)
Флаги не модифицирует.
AND op1, op2; op1:= op1^ op2
Например, 0Fh ^ 15h = 05h
^ |
00001111 |
00010101 |
|
|
00000101 |
OR op1, op2; op1:= op1 v op2
Например, 0Fh v 15h = 1Fh
XOR op1, op2; op1 := op1 op2
Например, 0Fh v 15h = 1Ah
TEST op1, op2; op1^ op2 – результат не запоминается
Эта операция называется «логическое сравнение». Цель формирование флага
ZF = 1 - если результат нулевой, иначе ZF = 0.
Как правило, второй операнд трактуется как маска, хранящая единицы в тех разрядах, которые нужны для дальнейшей обработки.
б) Команды сдвигов
Сдвиги на n разрядов влево можно трактовать, как умножение на 2n, потому все команды сдвигов имеют 2 операнда:
оp1 – рассматривается, как набор битов, подлежащих сдвигу;
op2 – константа сдвига, т.е. целое число без знака, может принимать значение 1 или CL. Единица означает сдвиг на 1 разряд, а CL – содержимое регистра CL, хранящего значение n. Сдвиг с CL выполняется как повтор однократных сдвигов, содержимое CL не меняется, при CL=0, сдвиг блокируется.
Результат записывается на место первого операнда.
Команды сдвига модифицируют флаги, кроме AF, а “уходящий” бит фиксируется в CF.
Команды сдвига бывают логические, арифметические и циклические.
Рассмотрим их на командах однократного сдвига.
Логический сдвиг – для беззнаковых чисел может применяться для ускоренного умножения (деления) на 2, выполняется по схеме (см. рис.8)
CF
op
SHR op,1 ; сдвиг вправо 0
Рис.8
Арифметический сдвиг – применяется для ускоренного умножения (деления) на 2 чисел со знаком, выполняется по схеме (см. рис.9).
SAL op,1 ; сдвиг влево
SAR op,1 ; сдвиг вправо 0
Рис.9
Циклический сдвиг – для беззнаковых целых, выполняется по схеме (см. рис.10).
ROL op,1 ; сдвиг влево
ROR op,1 ; сдвиг вправо
Рис.10
Циклический сдвиг через флаг , выполняется по схеме (см. рис.11).
CF
op
RCR op,1 сдвиг вправо
Рис.11
Команды работы со стеком
Стек – это область оперативной памяти, запись и чтение данных в которой основан на принципе LIFO (Last input first output, т.е. «последним пришел – первым ушел»).
Последовательность данных, которая загружена в стек, может быть считана только в обратном порядке. Стек используется в ПЭВМ для временного хранения данных, необходимых для организации процедур, для передачи параметров в процедуры, а так же для хранения некоторых промежуточных данных.
Считывание и загрузка в стек осуществляется двухбайтовыми словами.
Стек организуется программно в памяти, для стека можно отвести любую область памяти, удовлетворяющую двум требованиям:
максимальная емкость 64КБ (32К слов),
конечный адрес должен быть кратным 16 (параграф).
Стек занимает один сегмент памяти, называемый сегментом стека, с сегментным регистром SS, указывающим на начало, т.е. базу стека. Для работы со стеком обычно используют косвенную адресацию через регистр SP – указатель стека, указывающий на текущую ячейку стека, называемую вершиной стека.
В начале работы с SP указывают на последнюю ячейку сегмента стека. При загрузке числа автоматически производится декремент SP := SP–2.
Считывание числа из стека сопровождается автоматическим инкрементом: SP := SP+2, причем считается, что ячейка стека свободна и готова для последующего использования, но ее содержимое после считывания не изменяется.
Для дополнительного обращения к элементам стека (не через вершину) можно использовать регистр ВР, называемый дополнительным указателем стека.
Если в программе нет явного использования стека, то необходимо его зарезервировать в объеме 128Б для автоматического использования.