Команда безусловного перехода jmp.
Дисциплина «Машино-ориентированное программирование»
Команды передачи управления.
(слайд №2)
Обычно в программе есть точки, в которых нужно принять решение о том, какая команда будет выполняться следующей. Это решение может быть:
1. безусловным – в данной точке необходимо передать управление не той команде, которая идет следующей, а другой, которая находится на некотором удалении от текущей команды;
2. условным – решение о том, какая команда будет выполняться следующей, принимается на основе анализа некоторых условий или данных.
Какая команда должна выполняться следующей, микропроцессор узнает по содержимому пары регистров cs:( e ) ip, в которой:
· cs – сегментный регистр кода, в котором находится физический адрес текущего сегмента кода;
· eip / ip – регистр указателя команды, в котором находится значение, представляющее собой смещение в памяти следующей команды, подлежащей выполнению, относительно начала текущего сегмента кода (eip – для 32-хразрядная адресация, ip – 16-тиразрядная адресация).
Таким образом, команды передачи управления изменяют содержимое регистров cs и eip, в результате чего микропроцессор выбирает для выполнения не следующую по порядку команду программы, а команду в некотором другом участке программы. Конвейер внутри микропроцессора при этом сбрасывается.
По принципу действия команды микропроцессора, обеспечивающие организацию переходов в программе, можно разделить на три группы:
|
|
1. Команды безусловной передачи управления:
· команда безусловного перехода;
· вызов процедуры и возврат из процедуры;
· вызов программных прерываний и возврат из программных прерываний;
2. Команды условной передачи управления:
· команды перехода по результату команды сравнения;
· команды перехода по состоянию определенного флага;
· команды перехода по содержимому регистра ecx/cx.
3. Команды управления циклом:
· команды организации цикла со счетчиком ecx/cx;
· команды организации цикла со счетчиком ecx/cx с возможностью досрочного выхода из цикла по дополнительному условию.
(слайд №3)
Обозначение места, куда необходимо передать управление, в ассемблере делается с помощью меток.
Метка – это символическое имя, обозначающее определенную ячейку памяти, предназначенное для использования в качестве операнда в командах передачи управления.
Подобно любой переменной, транслятор ассемблера присваивает любой метке 3 атрибута:
1. имя сегмента кода, где эта метка описана;
2. смещение – расстояние в байтах от начала сегмента кода, в котором описана метка;
|
|
3. тип метки, или атрибут расстояния:
· near – переход на эту метку возможен только в пределах сегмента кода, где эта метка описана; физически это означает, что для перехода на метку достаточно изменить только содержимое регистра eip/ip;
· far – переход на эту метку возможен только в результате межсегментной передачи управления, для осуществления которой требуется изменение содержимого как регистра eip/ip, так и регистра cs.
Метку можно определить 2-мя способами:
1. оператором :
символическое_имя : [ команда _ ассемблера ]
Определенную таким образом метку можно использовать в качестве операнда в командах условного перехода jcc и безусловного перехода jmp, call. Эти команды должны быть в сегменте кода, где определена метка. Команда ассемблера может находится как на одной строке с меткой, та и на следующей.
2. директивой label.
Символическое_имя label тип_метки
Пример:
m1:
mov ax, pole_1
и
m1 label near
mov ax, pole_1
Если возникает необходимость использовать для одной и той же команды метку и дальнего, и ближнего типов, то в этом случае необходимо определить две метки:
…
public m_far ; сделать метку m_far видимой для внешних программ
…
|
|
m_far label far ; определение метки дальнего типа
m_near: ; определение метки ближнего типа
mov ax, pole_1
…
(слайд №4)
Безусловные переходы.
Команды перехода модифицируют регистр указателя команды eip/ip и, возможно, сегментный регистр cs. Что именно должно подвергнуться модификации, зависит:
1. от типа операнда в команде безусловного перехода (ближний или дальний);
2. от указания перед адресом перехода (в команде перехода) модификатора; при этом сам адрес перехода может находиться либо непосредственно в команде (прямой переход), либо в регистре или ячейке памяти (косвенный переход).
Модификатор может принимать следующие значения:
near ptr – прямой переход на метку внутри текущего сегмента кода. Модифицируется только регистр eip/ip на основе указанных в команде адреса (метки) или выражения, использующего символ извлечения значения счетчика адреса команд – $.
far ptr – прямой переход на метку в другом сегменте кода. Адрес перехода задается в виде непосредственного операнда или адреса (метки) и состоит из 16-тибитного селектора и 16/32-битного смещения, которые загружаются, соответственно, в регистры cs и ip/eip.
word ptr – косвенный переход на метку внутри текущего сегмента кода. Модифицируется (значением смещения из памяти, по указанному в команде адресу или из регистра) только eip/ip. Размер смещения 16 или 32 бита.
|
|
dword ptr – косвенный переход на метку в другом сегменте кода. Модифицируются (значением из памяти – и только из памяти, из регистра нельзя) оба регистра, cs и eip/ip. Первое слово/двойное слово этого адреса представляет смещение и загружается в ip/eip; втрое/третье слово загружается в cs.
Команда безусловного перехода jmp.
Синтаксис команды безусловного перехода:
jmp [модификатор] адрес_перехода
безусловный переход без сохранения информации о точке возврата. Адрес_перехода представляет собой адрес в виде метки либо адрес области памяти, в которой находится указатель перехода.
Есть несколько кодов машинных команд безусловного перехода jmp. Их различия определяются дальностью перехода и способом целевого адреса. Дальность перехода определяется местоположением операнда адрес_перехода. Это адрес может находиться в текущем сегменте кода или в некотором другом сегменте. В первом случае переход называется внутрисегментным, или близким, во втором – межсегментным, или дальним.
(слайд №5)
Внутрисегментный переход предполагает, что изменяется только содержимое регистра eip/ip. Можно выделить 3 варианта внутрисегментного использования команды jmp:
1. прямой короткий;
2. прямой;
3. косвенный.
Прямой короткий внутрисегментный переход применятся, когда расстояние от команды jmp до адреса_перехода не более чем -128 или +127. В этом случае транслятор ассемблера формирует машинную команду безусловного перехода всего 2 байта: 1-ый байт – код операции, значение 2-го байта вычисляется транслятором как разность между значением смещения команды, следующей за jmp, и значением адреса перехода. Если адрес перехода расположен до команды jmp, то ассемблер формирует короткую команду безусловного перехода без дополнительных указаний. В случае расположения адреса перехода после команды jmp транслятор не может сам определить, что переход короткий, т.к. у него еще нет информации об адресе перехода. Для оказания помощи компилятору в формировании команды короткого безусловного перехода в дополнение к вышерассмотренным используют модификатор short ptr.
Пример:
…
Jmp short ptr m 1
… ; не более 35-40 команд (127 байтов)
m1:
или
m1:
…
Дата добавления: 2022-07-02; просмотров: 24; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!