- •Структура мп ix86 фирмы Intel
- •Регистры общего назначения (регистры данных)
- •Регистры-указатели
- •Регистры сегментов (сегментные регистры)
- •Указатель команд и регистр флагов
- •Сегментация памяти
- •Структура команд мп
- •Формат «Регистр-регистр» (Рг-Рг) – 2 байта
- •Формат «Регистр-память» (Рг-яп) – 2÷4 байта
- •Формат «Регистр-непосредственный операнд» (Рг-но) – 3÷4 байта
- •Формат «Память-непосредственный операнд» (яп-но) – 3÷6 байтов
- •Представление данных в пэвм
- •Целые числа
- •Двоично-десятичные числа (bcd)
- •Символьные данные
- •Вещественные данные
- •Система команд мп семейства iх86 фирмы Intel
- •Команды сложения и вычитания
- •Дополнительные команды
- •Команды умножения и деления
- •Команды преобразования длины
- •Стековые команды
- •Доступ к элементам стека с помощью регистра вр
- •Команды передачи управления
- •Близкие и далекие переходы.
- •Адресация в переходах.
- •Конструкции языка Ассемблера Литература
Стековые команды
а) PUSH op; запись слова в стек, флаги не модифицируются
ор – может быть в регистре (в том числе и в сегментном) или в ячейке памяти, но не непосредственный операнд.
Алгоритм выполнения:
декремент значения SP:=SP–2;
пересылка содержимого ор на сводную ячейку стека с адресом [SS:SP] (в польской инверсной записи).
Пример:
PUSH AX
Примечание: Если организуется стековый сегмент в максимальном объеме (64КБ), то при полном заполнении, происходит разрушение ранее записанной информации (см. рис.12)
Рис.12
Если стек имеет меньший размер, то при полном его заполнении каждое новое обращение разрушает область памяти вне стекового сегмента (см. рис.13).
SS 128Б
Рис. 13
б) РОР ор ; чтение слова из стека
ор – аналогично PUSH.
Алгоритм выполнения:
слово из ячейки стека пересылается в ор (порядок байтов восстанавливается),
инкремент SP := SP +2
Пример:
POP CX
Примечание:
Если пытаться считывать из пустого стека, то ошибка не фиксируется, а считывается слово, следующее за сегментом стека.
в) PUSHF ; копирование слова из регистра FLAGS в стек
POPF ; копирование слова из стека в регистр FLAGS
ор отсутствует, флаги не изменяются.
Эти команды позволяют модифицировать флаг TF. Т.к. другого пути воздействия на TF нет, то нужно выполнить засылку флага в стек, затем изменить 8-й бит и записать новое значение из стека в регистр FLAGS.
Доступ к элементам стека с помощью регистра вр
Доступ к любому слову, хранящемуся в стеке, осуществляется на основе определения расстояния от нужного слова до вершины стека и базовой адресации.
Например:
MOV BP,SP ; BP := SP
MOV AX,[BP+4] ; эквивалентно MOV AХ, SS:[BP+4]
Примечание: ВР по умолчанию относится к сегменту стека, а не к сегменту данных.
Команды передачи управления
Это наиболее важная часть системы команд, тесно связанная со структурой ПЭВМ, и является промежуточным звеном между командами МП и командами языка ассемблера; наибольший интерес при этом представляют методы адресации, используемые для определения адреса ячейки памяти, которой передается управление.
Близкие и далекие переходы.
Мнемоники команд переходов в ЯА образуются от слова Jump.
Например, безусловный переход:
JMP оp,
где ор – имя команды, которой передается управление (т.е. метка).
Команды перехода модифицируют указатель команд IP и, возможно, регистр сегмента команд CS и бывают двух типов:
если команда изменяет только IP , т.е. передача управления внутри сегмента, то переход называется ближний переход NEAR.
если изменяется пара регистров CS:IP, - это межсегментный переход или далекий переход FAR.
Адрес перехода ассоциируется с меткой команды. Метка – это имя команды, которое располагается до мнемоники команды и отделяется двоеточием. Любая программная метка (включая имя процедуры) имеет атрибут NEAR или FAR.
Например,
АМ1: ADD AX,4
………………….
JMP AM1
Адресация в переходах.
а) Прямая адресация.
Команда содержит в себе базовый адрес сегмента и смещение. Это допускается только в командах межсегментного перехода или вызова процедур. Метка, которой передается управление, должна иметь атрибут FAR.
JMP CATS
где CATS – метка команды или имя процедуры.
б) Косвенная адресация
Адрес перехода содержится в регистре или ячейке памяти. Это допускается для межсегментных и внутрисегментных переходов.
JMP AX ; в АХ заранее помещен перехода
JMP NEAR COD[BX]
Во втором примере есть явное указание типа перехода (NEAR – оператор в команде), COD[BX] – базовая адресация команды, которой передается управление.
в) Относительная адресация
Место перехода указывается как некоторое расстояние от самой команды перехода. Эффективный адрес перехода вычисляется суммированием индекса смещения, находится в команде и текущего значения указателя команд IP.
Имеется 2 типа:
с 1Б индексным смещением, обеспечивает передачу управления в диапазоне (-128:128Б) (SHORT)
с 2Б индексным смещением
(-32 768:32768Б) от текущей команды NEAR
Операндом является метка с атрибутом NEAR, по которой ассемблер автоматически вычисляет значение. В команде может быть указан тип перехода:
mov w, offset L1; (в ячейку w записывается смещение L1 относительно текущей команды offset – смещение)
JMP w или JMP SHORT w
Команды условных переходов
Делятся на 2 группы:
а) операторы, анализирующие результаты предыдущей команды (флаги) – условный переход в классическом понимании. Они имеют только 1-байтовое смещение.
Если условный переход требует удаление более чем на 128Б (30-40 команд), то используется комбинация условного и безусловного перехода.
Например:
Требуется NEAR переход на метку ZERO по флагу ZF=1, тогда
………..
JNZ CONTINUE; if ZF<>1 then continue
JMP ZERO
CONTINUE
Т.е. используется условный переход по противоположному признаку, а по ZF=1 получим 2-хбайтовый переход.
Мнемоника условного перехода сложна, таких переходов более 20. Некоторые очевидны. Для образовании мнемоники используют следующие сокращения:
E – equal (=)
N – not (не)
G – больше для знаковых целых
L – меньше для знаковых целых
A – above (выше) беззнаковых
B –below (ниже) для беззнаковых
В условных переходах используется после J от одной до трех букв (из перечисленных выше).
Например, после сравнения чисел результат ор1<ор2, возможны 2 команды, эквивалентные между собой для одного и того же перехода.
Для знаковых JL ADRES
JMGE ADRES
Для беззнаковых JB ADRES
JNA ADRES
б) команды управления циклом
LOOP ор
Управление циклом по счетчику, где ор – метка первой команды цикла, цикл управляется счетчиком в СХ.
Команда LOOP уменьшает содержимое СХ (dec СХ) и передает управление в начало цикла, если содержимое СХ<>0, иначе управление передается команде следующей за LOOP.
Обычно цикл оформляется следующим образом.
mov CX,N ; СХ = числу переходов цикла
L1: ……… начало цикла
……………….
LOOP L1;
Команда LOOP эквивалентна 3-м командам:
Dec CX
Cmp CX, 0
Jne L1
Особенности команды LOOP:
счетчик цикла находится только в CX;
начальное значение загружается в CX>0 до входа в цикл;
команды прохода цикла выполняются хотя бы один раз;
LOOP осуществляет переход типа SHORT, поэтому проход цикла не должен занимать 128Б (30-40 команд); если нужен более длинный проход цикла, то используется сочетание условных и безусловных переходов;
CX может использоваться как операнд в цикле, но не должен изменяться другими командами.
Есть и другие команды управления циклом.
Например, команды перехода по циклу с дополнительным условием, а именно с учетом флага ZF. Можно использовать 2 эквивалентные записи:
LOOPE op
LOOPZ op
Здесь цикл повторяется CX раз, пока сохраняется ZF=1, что соответствует сложному условию передачи управления CX<>0 AND ZF=1.
Эти команды управления циклом обычно используются для решения задач поиска в последовательностях, их основной недостаток состоит в том, что неочевидна причина выхода их цикла, и требуется дополнительный анализ по окончании цикла.