Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ASM.docx
Скачиваний:
3
Добавлен:
31.07.2019
Размер:
616.28 Кб
Скачать

II промежуточный вариант — внутри другой процедуры или основной программы (в этом случае необходимо предусмотреть обход процедуры с помощью команды безусловного перехода j м р);

в другом модуле (библиотеке DLL).

Команда CALL осуществляет вызов процедуры (подпрограммы). Синтаксис команды:

call [модификатор] имя_процедуры

Подобно команде JMP команда CALL передает управление по адресу с символи ческим именем имя_процедуры, но при этом в стеке сохраняется адрес возврата(то есть адрес команды, следующей после команды CALL).

li Команда RET считывает адрес возврата из стека и загружает его в регистры CS и EIP/IP, тем самым возвращая управление на команду, следующую в программе за командой CALL Синтаксис команды:

ret [число] Необязательный параметр [число] обозначает количество элементов, удаляемых из стека при возврате из процедуры. Размер элемента определяется хорошо знакомыми нам параметрами директивы SEGMENT — use!6 и use32 (или соответствующим параметром упрощенных директив сегментации). Если указан

параметр usel6, то [число] — это значение в байтах; если use32 — в словах.

35Команды условной передачи управления. Команды организации циклов.

Условные переходы. До сих пор мы рассматривали команды перехода с ≪безусловным≫ принципом действия, но в системе команд процессора есть большая группа команд, призванных самостоятельно принимать решение о том, какая команда должна выполняться следующей. Решение принимается в зависимости от определенных условий, определяемых конкретной командой перехода. Процессор поддерживает 18 команд

условного перехода, позволяющих проверить:

отношение между операндами со знаком (больше или меньше);

отношение между операндами без знака (выше или ниже)2;

состояниями арифметических флагов ZF, SF, CF, OF, PF (но не AF).

Команды условного перехода имеют одинаковый синтаксис:

j c c метка_перехода.Как видно, мнемокод всех команд начинается с символа ≪j≫ — от слова jump(прыжок). Вместо символов ≪ее≫ указывается конкретное условие, анализируемое командой. Что касается операнда метка_перехода, то он определяет метку перехода, которая может находиться только в пределах текущего сегмента кода; межсегментной передачи управления в условных переходах не допускается.

Для того чтобы принять решение о том, куда будет передано управление ко-

мандой условного перехода, предварительно должно быть сформировано условие,на основании которого должно приниматься решение. Источниками такого условия могут быть:

любая команда, изменяющая состояние арифметических флагов;

команда СМР, сравнивающая значения двух операндов;

состояние регистра ЕСХ/СХ.

Обсудим эти варианты, чтобы разобраться с тем, как работают команды условного перехода.

Команда сравнения

Команда сравнения СМР (СоМРаге) имеет интересный принцип работы. Он абсолютно такой же, как у команды вычитания SUB (см. главу 8). Команда СМР так же,как и команда SUB, выполняет вычитание операндов и по результатам сравнения устанавливает флаги. Единственное, чего она не делает, — не записывает результат вычитания на место первого операнда.

Синтаксис команды СМР:

стр операнд_1,операнд_2

Флаги, устанавливаемые командой СМР, можно анализировать специальными командами условного перехода. Прежде чем мы их рассмотрим, уделим немного внимания мнемонике этих команд (табл. 10.1). Понимание обозначений (элементов в названии команды JCC, обозначенных нами символами ≪ее≫) при формировании названия команд условного перехода облегчит их запоминание и дальнейшее практическое ипользование.

В табл. 10.2 представлен перечень команд условного перехода для команды СМР.

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

нальную направленность. Тем не менее, то, что эти команды реагируют на одни

и те же флаги, делает их абсолютно эквивалентными и равноправными в програм-

ме. Именно поэтому они сгруппированы не по названиям, а по значениям флагов

(условиям), на которые они реагируют.

Команды условного перехода и флаги

Мнемоническое обозначение некоторых команд условного перехода отражает на-

звание флага, с которым они работают, и имеет следующую структуру: первым идет

символ ≪j≫ (jump ~ переход), вторым — либо обозначение флага, либо символ от-

рицания ≪п≫, после которого стоит название флага. Такая структура команды от-

ражает ее назначение. Если символа ≪п≫ нет, то проверяется состояние флага и,

если он равен 1, производится переход на метку перехода. Если символ ≪п≫ при-

сутствует, то проверяется состояние флага на равенство 0 и в случае успеха произ-

водится переход на метку перехода. Мнемокоды команд, названия флагов и усло-

вия переходов приведены в табл. 10.3. Эти команды можно использовать после

любых команд, изменяющих указанные флаги.

Команды условного перехода и регистр ЕСХ/СХ

Архитектура процессора предполагает специфическое использование многих ре-

гистров. К примеру, регистр EAX/AX/AL используется как аккумулятор, а регистры

ЕВР/ВР, ESP/SP — для работы со стеком. Регистр ЕСХ/СХ тоже имеет определенное

функциональное назначение — он выполняет функции счетчика в командах

управления циклами и при работе с цепочками символов. Возможно, что функци-

онально команды условного перехода, связанные с регистром ЕСХ/СХ, правильнее

было бы отнести к этой группе команд.

Организация циклов 229

Синтаксис команд JCXZ (Jump if ex is Zero — переход, если СХ ноль) и J ECXZ (Jump

Equal ecx Zero — переход, если ЕСХ ноль) таков:

j c x z / j e c x z метка_перехода

Организация циклов

Цикл, как известно, представляет собой важную алгоритмическую структуру, без

которой не обходится, наверное, ни одна программа. Организовать циклическое

выполнение некоторого фрагмента программы можно, к примеру, используя ко-

манды условной передачи управления или команду безусловного перехода JMP.

Команда LOOP позволяет организовать циклы (loops), подобные циклам for

в языках высокого уровня с автоматическим уменьшением счетчика цикла. Син-

таксис команды:

loop метка_перехода

Команда реализует описанные далее действия.

1. Декремент регистра ЕСХ/СХ.

2. Сравнение регистра ЕСХ/СХ с нулем:

П если (ЕСХ/СХ) > 0, то управление передается на метку перехода;

П если (ЕСХ/СХ) = 0, то управление передается на следующую после LOOP ко-

манду.

Команды LOOPE и LOOPZ (Loop still сх <> 0 or Zero flag = 0 — повторить цикл пока

СХ <> 0 или ZF = 0) — абсолютные синонимы, поэтому используйте ту команду, ко-

торая вам больше нравится. Синтаксис команд:

loope/loopz метка_перехода

Команды реализуют описанные далее действия.

1. Декремент регистра ЕСХ/СХ.

2. Сравнение регистра ЕСХ/СХ с нулем и анализ состояния флага нуля ZF:

П если (ЕСХ/СХ) > 0 и ZF = 1, управление передается на метку перехода;

Организация циклов 231

D если (ЕСХ/СХ) = 0 или ZF=0, управление передается на следующую после ШОР

команду.

Команды LOOPNE и LOOPNZ (Loop still ex <> 0 or NonZero flag = 0 — повторить

цикл, пока СХ <> 0 или ZF = 1) также абсолютные синонимы. Синтаксис команд:

loopne/loopnz метка_перехода

Команды реализуют описанные далее действия.

1. Декремент регистра ЕСХ/СХ.

2. Сравнение регистра ЕСХ/СХ с нулем и анализ состояния флага нуля ZF:

П если (ЕСХ/СХ) > 0 и ZF = 0, управление передается на метку перехода;

П если (ЕСХ/СХ) = 0 или ZF = 1, управление передается на следующую после LOOP

команду.

Команды LOOPE/LOOPZ и LOOPNE/LOOPNZ по принципу своей работы являются

взаимнообратными. Они расширяют действие команды LOOP тем, что дополнитель-

но анализируют флаг ZF. Это дает возможность организовать досрочный выход из

цикла, используя этот флаг в качестве индикатора. Типичное применение этих

команд связано с операцией поиска определенного значения в последовательно-

сти или со сравнением двух чисел.

37) Процессор, желая записать данное по некоторому адресу в памяти, выставляет на линии адресов требуемый адрес, а на линии данных - данное. Устройство управления памятью расшифровывает поступивший адрес и, если этот адрес принадлежит памяти, принимает с линий данных поступившее данное и заносит его в соответствующую ячейку памяти. Описанная процедура отражает выполнение процессором команды типа

 mov mem,AX

где mem - символическое обозначение ячейки памяти, принадлежащей сегменту данных программы. Если процессор, выполняя команду типа

mov AX, mem

должен прочитать данное из памяти, он выставляет на линии адресов требуемый адрес и ожидает поступления данных. Устройство управления памятью, расшифровав поступивший адрес и убедившись в наличии такого адреса в памяти, отыскивает в памяти требуемую ячейку, считывает из нее данное и выставляет его на линии данных. Процессор снимает данное с шины и отправляет его в указанный в команде операнд (в данном случае в регистр АХ). Описанные процедуры записи и чтения справедливы не только по отношении к памяти; для всех остальных устройств компьютера они выглядят точно так же. За каждым устройством закреплена определенная группа адресов, на которые оно должно отзываться. Обнаружив свой адрес на магистрали, устройство, в зависимости от заданного процессором направления передачи данных, либо считывает с магистрали поступившие данные, либо, наоборот, устанавливает имеющиеся в нем данные на магистраль.

 

38) Директивы управляют работой Ассемблера, а не МП. С их помощью можно определять сегменты и процедуры, давать имена сегментам данных. Резервировать рабочие области памяти и выполнять другие задачи. Директивы не генерируют объектного кода. Команды могут содержать до 4-х полей. - индификатор - директивы (обязательно) - операнды - комментарии Для одних директив идентификатор обязателен, для других запрещен, а для 3-х не обязателен. Комментарии всегда не обязательны. Поле директив может начинаться с любой позиции строки, но они должны отделяться пробелами. В макроассемблере предусмотрено 60 директив.

 

 

28)     Сегмент состояния задачи TSS (Task State Segment) - это структура данных, которая определяет состояние (т.е. контекст) задачи. В ней хранится содержимое всех регистров общего назначения, сегментных и некоторых системных регистров а также некоторая дополнительная информация.         Для каждой задачи в системе нужно определить один сегмент TSS и далее процессор будет сам использовать эти сегменты задач, т.е. структура TSS поддерживается аппаратно.         TSS бывают двух типов - 16- и 32-разрядные. 16-разрядные появились в процессоре i286 и они могут использоваться в 32-разрядных процессорах, но мы их рассматривать не будем, потому что программирование Intel286 здесь не рассматривается.         32-разрядные TSS появились в процессоре Intel386, с тех пор они не претерпели изменений и на них строится механизм мультизадачности любой ОС защищённого режима. Везде далее, где мы будем говорить о TSS, именно такие, 32-разрядные, и будут подразумеваться.         На рис. 3-1 приведена структура 32-разрядного TSS:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]