![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Процедуры
Процедура (или, как часто говорят, подпрограмма) представляет собой совокупность команд, которая написана один раз, но может быть исполнена по мере необходимости в любом месте программы, любое количество раз. Процесс передачи управления из основной части программы в процедуру называется вызовом, т.е. процедура вызывается. При вызове процедуры микропроцессор исполняет ее команды, а затем возвращается к тому месту, откуда был сделан вызов. Возникают два вопроса: как вызвать процедуру и как микропроцессор возвращает управление в нужное место программы? Для ответа на них рассмотрим некоторые команды. Команда вызова процедуры- CALL (call a procedure-вызвать процедуру). Эта команда, выполняет две функции: 1. Обеспечивает сохранение содержимого указателя команд IP (адреса возврата) и содержимое CS. 2.Загружает в IP новый адрес команды, соответствующий вызываемой процедуре. Таким образом, команда CALL сохраняет адреса возврата в стеке и передает управление процедуре. Она помещает в стек адрес возврата, занимающий 16 бит, если процедура определена с атрибутом NEAR-ближняя, и 32 бита, если она определена с атрибутом FAR-дальняя. Процедуры с атрибутом NEAR могут быть вызваны только из того сегмента, в котором они находятся. Процедуры с атрибутом FAR могут быть вызваны и из другого сегмента. Команда CALL имеет следующий формат: CALL имя; где «имя»-имя вызываемой процедуры. При трансляции, ассемблер присваивает метке имя, 16- разрядный адрес, и по команде CALL этот адрес записывается в указатель команд – IP. Команда RET (return from procedure - возвратиться из процедуры). Заставляет микропроцессор возвратиться из процедуры в программу, вызвавшую эту процедуру делая это " откатом" всего, что сделала команда CALL. Формат команды: RET Команда RET обязательно должна быть последней командой процедуры, исполняемой микропроцессором. (Это не значит, что команда RET должна стоять в конце процедуры, она исполняется последней). Команда RET извлекает из стека адрес возврата. Если процедура имеет атрибут NEAR (т.е. находится в том же сегменте команд, что и команда CALL), то команда RET извлекает из стека одно слово и загружает его в указатель команд IP. Если процедура имеет атрибут FAR (т.е. находится в другом сегменте команд), то команда RET извлекает из стека два слова: сначала смещение адреса для загрузки в указатель команд IP, а затем адрес сегмента для загрузки в регистр CS. Например, для вызова процедуры MY_PROC с атрибутом NEAR из некоторого места программы, необходимо выполнить следующую последовательность команд (в левом столбце указаны смещения адресов команд): 04F0 CALL MY PROC; Вызвать процедуру. 04F3 М2: Mov AX, BX; Вернуться сюда из процедуры. 0500 My_proc PROC; Начало процедуры Mov CL, 6; Команды процедуры. ... ... 051Е Ret; Вернуться в основную программу. При исполнении команды CALL микропроцессор помещает в стек смещение адреса метки М2 (04F3H), затем загружает смещение адреса процедуры MY_PROC (0500H) в указатель команд IP. Так как в псевдооператоре PROC атрибут дистанции не указан, то процедура MY_PROC по умолчанию имеет атрибут NEAR. Содержимое регистра IP изменилось, следовательно, микропроцессор продолжит исполнение с той команды, которая имеет это новое смещение адреса. В нашем примере такой командой будет MOV CL, 6 Когда микропроцессор обнаруживает команду RET, то он извлекает адрес возврата из стека и помещает его в указатель команд IP. Это заставляет его возобновить исполнение программы с команды, имеющей метку М2. Команда JMP (jump unconditionally - перейти безусловно) заставляет микропроцессор извлечь новую команду не из следующей ячейки памяти, а из другой, адрес которой определен меткой. Команда JMP имеет формат: JMP имя; Операнд «имя» подчиняется тем же правилам, что и операнд команды CALL. Иначе говоря, он может иметь атрибут NEAR или FAR, быть прямым или косвенным. При прямом переходе команда JMP занимает три байта, если метка имя имеет атрибут NEAR, и пять байтов, если она имеет атрибут FAR. Например, команда JMP М3 занимает три байта, если метка М3 находится в том же сегменте, или пять байтов, если она находится в другом сегменте. Если адрес метки находится не далее -128 или +128 байтов от адреса команды JMP, то можно сделать команду JMP двухбайтовой, указав, что ее операнд имеет тип SHORT (short — короткий). Например, команда JMP SHORT М4 займет два байта. Обычно команда JMP используется для обхода группы команд, которым передается управление из другой части программы.
|