Команда безусловного перехода 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!