- •1, 2,... Данная совокупность ячеек называется оперативной памятью.
- •I80386 первым из семейства процессоров Intel стал поддерживать возможность
- •23Формирование адреса. Сегментная адресация в реальном и защищенном режимах. Размер сегмента. Адресное пространство.
- •I80386 с 32-разрядной шиной команд и данных в целях совместимости программ
- •II локальная дескрипторная таблица (Local Descriptor Table, ldt), ее адрес хра-
- •24.Формирование адреса. Страничная адресация.
- •Is Первую группу образуют пользовательские регистры, к которым относятся:
- •Il указателей на ячейки памяти.
- •II регистр-счетчик (Count register) ecx/cx/ch/cl применяется в командах, произ-
- •26Дескрипторы сегментов. Глобальные и локальные таблицы дескрипторов. Регистры gdtr и ldtr. Селекторы.
- •34Команды безусловной передачи управления. Команды вызова процедур и возврата из процедуры.
- •II промежуточный вариант — внутри другой процедуры или основной программы (в этом случае необходимо предусмотреть обход процедуры с помощью команды безусловного перехода j м р);
- •35Команды условной передачи управления. Команды организации циклов.
- •Как видите, большая часть полей предназначена для хранения содержимого регистров общего назначения и сегментных регистров
34Команды безусловной передачи управления. Команды вызова процедур и возврата из процедуры.
Безусловные переходы
Предыдущее обсуждение выявило некоторые детали механизма перехода. Коман-
ды перехода модифицируют регистр указателя команды EIP/IP и, возможно, сег-
ментный регистр кода CS. Что именно должно подвергнуться модификации,
зависит:
от типа операнда в команде безусловного перехода (ближний или дальний);
от модификатора, который указывается перед адресом перехода в команде пе-
рехода и может принимать следующие значения (сам адрес при прямом пере-
ходе находится непосредственно в команде, а при косвенном — в регистре или
ячейке памяти):
П NEAR PTR — прямой переход на метку внутри текущего сегмента кода, при
этом модифицируется только регистр EIP/IP (в зависимости от заданного
типа сегмента кода use!6 или use32) на основе указанного в команде адреса
(метки) или выражения, использующего символ извлечения значения счет-
чика адреса команд ($);
П FAR PTR — прямой переход на метку в другом сегменте кода, при этом адрес
перехода задается в виде непосредственного операнда или адреса (метки)
и состоит из 16-разрядного селектора и 16/32-разрядного смещения, кото-
рые загружаются, соответственно, в регистры CS и EIP/IP;
D WORD PTR — косвенный переход на метку внутри текущего сегмента кода, при
этом модифицируется (значением смещения размером 16 или 32 бита из
памяти по указанному в команде адресу или из регистра) только регистр
EIP/IP;
D DWORD PTR — косвенный переход на метку в другом сегменте кода, при этом
модифицируются (значением из памяти — и только из памяти, из регистра
нельзя) оба регистра, CS и EIP/IP (первое слово/двойное слово адреса пере-
хода, представляющее собой смещение, загружается в EIP/IP; второе/третье
слово — в CS).
Команда безусловного перехода
Синтаксис команды безусловного перехода без сохранения информации о точке возврата:
jmp [модификатор] адрес_перехода
Здесь адрес_перехода представляет метку или адрес области памяти, в которой
находится указатель перехода.
Всего в системе команд процессора есть несколько кодов машинных команд
безусловного перехода JMP. Их различия определяются дальностью перехода
и способом задания целевого адреса. Дальность перехода определяется местоположением операнда адрес_перехода. Этот адрес может находиться в текущем сегменте кода или в некотором другом сегменте. В первом случае переход называется внутрисегментным, или близким, во втором — межсегментным, или дальним.
Внутрисегментный переход предполагает, что изменяется только содержимое регистра EIP/IP. Можно выделить три варианта внутрисегментного использования
команды JMP:
прямой короткий переход;
прямой переход;
косвенный переход.
Таким образом, модификаторы SHORT PTR, NEAR PTR и WORD PTR применяются
для организации внутрисегментных переходов, a FAR PTR и DWORD PTR — межсег-
ментных.
Для полной ясности нужно еще раз подчеркнуть, что если тип сегмента — use32,
то в тех местах, где речь шла о регистре IP, можно использовать регистр EIP и, соот-
ветственно, размеры полей смещения увеличить до 32 битов.
Процедура, или подпрограмма, — это основная функциональная единица декомпозиции (разделения на части) некоторой задачи. Процедура представляет собой
группу команд для решения конкретной подзадачи и обладает средствами получения управления из точки вызова задачи более высокого уровня и возврата управления в эту точку. В простейшем случае программа может состоять из одной процедуры. Другими словами, процедуру можно определить как правильным образом
оформленную совокупность команд, которая, будучи однократно описана, при необходимости может быть вызвана в любом месте программы.
Для описания последовательности команд в виде процедуры в языке ассемблера используются две директивы: PROC и ENDP.
Синтаксис описания процедуры таков (рис. 10.3).
Из рисунка видно, что в заголовке процедуры (директиве PROC) обязательным
является только задание имени процедуры. Среди большого количества операндов директивы PROC следует особо выделить [расстояние]. Этот атрибут может принимать значения NEAR или FAR и характеризует возможность обращения к процедуре из другого сегмента кода. По умолчанию атрибут [расстояние] принимает значение NEAR.
Процедура может размещаться в любом месте программы, но так, чтобы на неe случайным образом не попало управление. Если процедуру просто вставить в общий поток команд, то процессор воспримет команды процедуры как часть этогопотока и, соответственно, начнет выполнять эти команды. Учитывая это обстоятельство, есть следующие варианты размещения процедуры в программе:
в начале программы (до первой исполняемой команды);в конце программы (после команды, возвращающей управление операционной системе);