Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
12-12-2013_11-21-32 / пособие_m.doc
Скачиваний:
76
Добавлен:
10.05.2015
Размер:
484.35 Кб
Скачать

3.9.2 Команды безусловных переходов

Команда безусловного перехода с общей мнемоникой JMP имеет 5 различных форм, которые различаются расстоянием назначения от текущей команды и способом задания назначения целевого адреса.

В коротком (short) переходе двухбайтная команда JMP содержит во втором байте смещение, которое интерпретируется как знаковое целое. При выполнении этой команды значение смещения прибавляется с расширением знака к содержимому регистра EIP/IP и полученное значение соответствует адресу команды, выполняющейся после команды JMP. Диапазон смещений составляет от –128 до +127. Если смещение положительное, то осуществляется переход вперед, а если отрицательное – то назад.

Команда прямого внутрисегментного перехода (near) аналогична предыдущей, но эта команда содержит полное смещение, размер которого составляет 16 или 32 разряда. Смещение по-прежнему считается знаковым целым числом, которое прибавляется к содержимому регистра EIP. При выполнении этой команды управление передается в любую точку текущего кодового сегмента.

В команде косвенного внутрисегментного перехода, которая имеет следующий вид

JMP reg/mem

адрес перехода также ограничен текущим сегментом кода, однако этот адрес содержится в регистре или ячейке памяти и при выполнении этой команды содержимое регистра или ячейки памяти загружается в регистр EIP. Размер смещения составляет 16 или 32 разряда.

Команда прямого межсегментного перехода (far) содержит непосредственный операнд, являющийся указателем целевой команды. Этот операнд состоит из 16-разрядного селектора, который загружается в регистр CS, и 16- или 32-разрядного смещения, загружаемого в регистр EIP.

Команда косвенного межсегментного перехода (far) адресует в памяти полный 32- или 48-разрядный указатель селектор:смещение, при этом селектор загружается в регистр CS, а смещение – в регистр EIP.

3.9.3 Команды вызова подпрограмм

Команда вызова подпрограммы (процедуры) CALL передает управление с автоматическим сохранением в стеке адреса возврата, т.е. адреса команды, находящейся после команды CALL. Как команда безусловного перехода JMP, вызов подпрограммы может быть внутрисегментным и межсегментным. В первом случае вызываемая подпрограмма находится в текущем сегменте кода (тип near), и в этом случае как адрес возврата в стеке необходимо сохранить только содержимое регистра EIP. Во втором случае подпрограмма находится в другом кодовом сегменте (тип far) и в стеке необходимо сохранить содержимое регистров CS и EIP.

Команда CALL имеет такие же формы, как и команда JMP; отсутствует только короткая ( типа short ) форма. При выполнении команды CALL displ 16/32 осуществляется декремент регистра ESP, в стек включается содержимое регистра EIP, а смещение, указанное величиной displ 16/32 и рассматриваемое как знаковое число, прибавляется к содержимому регистра EIP. По полученному адресу процессор и осуществляет обращение к первой команде вызываемой процедуры.

При выполнении команды CALL mem/reg осуществляется внутрисегментный косвенный вызов подпрограммы. Источником адреса является содержимое либо регистра, либо ячейки памяти.

Команда прямого межсегментного вызова CALL addr позволяет вызывать подпрограмму, находящуюся в любой области адресного пространства памяти. Операнд addr содержит как новое содержимое кодового сегментного регистра, так и величину смещения, записываемую в регистр EIP. При выполнении этой команды осуществляются следующие действия:

  • осуществляется декремент регистра ESP;

- в адресуемую регистрами SS и ESP ячейку памяти записывается содержимое регистра CS;

  • осуществляется декремент регистра ESP;

  • в адресуемую регистрами SS и SEP ячейку памяти записывается содержимое регистра EIP;

  • в регистр CS заносится новое значение, которое берется из операнда addr;

  • в регистр EIP заносится новое значение, которое берется из операнда addr.

При выполнении команды CALL mem осуществляется косвенный межсегментный вызов подпрограмм через память. Текущее значение регистров CS и EIP запоминается в стеке, после чего из адресуемой ячейки памяти слово (или двойное слово) загружается в регистр EIP, а следующее слово – в регистр CS.

Соседние файлы в папке 12-12-2013_11-21-32