Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2014- СП 3.0 ЛАБЫ ОБЯЗАТ.doc
Скачиваний:
99
Добавлен:
01.03.2016
Размер:
896 Кб
Скачать
      1. Передача управления в другое место кода

Представим себе, что в памяти размещена основная программа и подпрограмма (рис. 7.1).

Рисунок 7.1- Основная программа и процедура.

В основной программе последовательно выполняются команды к1, к2, к3 и к4. После этого надо перейти к выполнению команды к31 в процедуре, затем команды к32, к33, к34. Потом хотелось бы вернуться в основную программу и продолжить ее с команды к5.

Рассмотрим пока только переход в процедуру. Ну, если совсем точно, то пока – передачу управления после команды к4 на команду к31.

Если вы поняли предыдущий раздел про последовательное выполнение команд, то вам должно быть ясно следующее. После чтения команды к4 в EIPавтоматически сформировалось значение 137 – это адрес команды к5. Но мы не планируем сейчас выполнять команду к5! Нам нужно заставить процессор сначала прочесть, а потом выполнять команду к31, которая расположена по адресу 334.

Решение этой проблемы очевидно. Нужно заменить в регистре EIP значение 137 на 334!Именно этазамена – это и есть передача управления.

Остается выяснить, как это технически сделать.

Первое, что нам интуитивно ясно – что такая замена сама собой не произойдет. Программист должен что-то написать в программе такое, что и выполнит эту работу. Наверное, соответствующую ассемблерную команду. Но, куда ее писать? Места для неё в коде сейчас нет. После команды к4 сразу идет к5, с которой мы должны продолжить выполнение основной программы после возврата из процедуры. Что делать?

Думать, когда пишешь исходный текст. После команды к4 следовало написать команду передачи управления. А потом уже к5. Значит, при правильном написании наш код должен был бы выглядеть не так, как на рис. 7.1, а как на рис. 7.2.

Рисунок 7.2- Вставка в код КПУ – команды передачи управления.

Итак, программист обеспечивает передачу управления вставкой команды передачи управления. Что же это за команды?

Прямо присвоить в нашем примере регистру EIPзначение 334 командой

Mov EIP, 334

запрещает система команд процессора, в ней прямое присвоение значения регистру EIPне допускается.

Но зато есть целая группа команд, которые непрямо меняют значение EIP. И самая простая из них – команда безусловного перехода «JMPметка».

В нашем случае метка входа в процедуру – этоР55 (числовое значение метки 334). Команда безусловного перехода в исходном тексте будет записана так:

JMP P55

Компилятор превратит эту строку в машинный код

E9 192

Здесь операндом команды является число 192 = 334 – 142, называемое «дистанция перехода».

Стало быть, команда jmpвыполняется следующим образом.

Она читается из памяти в процессор и становится EIP= 142. Далее команда прочитана и переходит в фазу исполнения. Процессор читаетEIP, оно 142, прибавляет к нему дистанцию перехода (она содержится прямо в машинном коде команды и равна 192) и получившееся число 334записывает обратно в регистр EIP. Как видим, число 142 вEIPволшебным образом () заменилось на 334 (а это и есть передача управления) и процессору теперь ничего не остается, как приступать к чтению команды к31, ну и далее по программе. Передача управления реализована.

Почему в машинную команду записывается не адрес перехода, а дистанция перехода? Ответ такой. Это делается для того, чтобы загрузка программы в разное место оперативной памяти (с разного начального адреса) не нарушала работоспособности программы. Фактический адрес передачи управления не задается жёстко, а вычисляется в ходе исполнения команды передачи через дистанцию перехода. Дистанция же перехода при любом начальном адресе остается неизменной, что и решает проблему мобильности программы в оперативной памяти: грузи от любого адреса, работать будет в любом случае.