Статус
нашего
сайта:
ICQ Secrets Center is Online  ICQ Information Center


ICQ SHOP
     5-значные
     6-значные
     7-значные
     8-значные
     9-значные
     Rippers List
ОПЛАТА
СТАТЬИ
СЕКРЕТЫ
HELP CENTER
OWNED LIST
РОЗЫСК!New!
ICQ РЕЛИЗЫ
Протоколы ICQ
LOL ;-)
Настройка компьютера
Аватарки
Смайлики
СОФТ
     Mail Checkers
     Bruteforces
     ICQTeam Soft
     8thWonder Soft
     Other Progs
     ICQ Patches
     Miranda ICQ
ФорумАрхив!
ВАШ АККАУНТ
ICQ LiveJournal

Реклама

Наш канал:

irc.icqinfo.ru

Таненбаум Э.- Архитектура компьютера. стр.557


Таненбаум Э.- Архитектура компьютера. стр.557

Для обработки операндов со знаками используются команды GREATER THAN и LESS THAN. Операнды без знаков обрабатываются командами ABOVE и BELOW.

Вызовы подпрограмм

В процессоре 8088 есть команда, позволяющая вызывать процедуры, которые в языке ассемблера обычно называются подпрограммами (subroutines). По аналогии с командами перехода здесь существуют команды ближнего и дальнего вызова. В интерпретаторе реализован только ближний вызов. Объект вызова либо является меткой, либо располагается по действительному адресу. Параметры, необходимые для вызова подпрограмм, первоначально размещаются в стеке в обратном порядке (рис. В.З). Применительно к языку ассемблера параметры обычно называются аргументами, хотя принципиального различия между этими терминами нет. После размещения аргументов в стеке выполняется команда CALL. В первую очередь, она вводит в стек текущее значение счетчика команд, со храняя, таким образом, адрес возврата. Адресом возврата называется адрес, по которому возобновляется исполнение вызывающей программы после возврата из подпрограммы.

Таненбаум Э.- Архитектура компьютера.

Далее из метки или с действительного адреса загружается новый счетчик команд. При дальнем вызове значение регистра CS размещается в стеке перед значением регистра PC, а счетчик команд и регистр кодового сегмента загружаются непосредственными данными или с действительного адреса. На этом выполнение команды CALL завершается.

Команда возврата, RET, выталкивает из стека адрес возврата, сохраняет его в счетчике команд, после чего выполнение программы возобновляется с команды, следующей непосредственно за командой CALL. Иногда в команде RET роль непосредственных данных выполняет положительное число. Это число рассматривается как ряд байтов аргументов, размещенных в стеке перед вызовом; оно прибавляется к значению SP, и стек очищается. При дальнем вызове (выполнении команды RETF) регистр кодового сегмента выталкивается после счетчика команд.

В рамках подпрограммы необходимо реализовать доступа к аргументам. По этой причине выполнение подпрограммы часто начинается с размещения в стеке указателя базы и копирования текущего значения регистра SP в регистр ВР. Таким образом, указатель базы указывает на свое предыдущее значение. После адрес возврата определяется путем прибавления к ВР двойки, а первый и второй аргументы располагаются по действительным адресам ВР + 4иВР + 6, соответственно. Если процедуре нужны локальные переменные, необходимое количество байтов можно вычесть из указателя стека; обращаться к этим переменным можно из указателя базы путем отрицательного смещения. В примере на рис. В.З имеются три однословных локальных переменных, расположенных по адресам ВР - 2, ВР - 4 и ВР - 6. Таким образом, весь набор текущих аргументов и локальных переменных становится доступным через регистр В Р.

В стеке, как обычно, сохраняются промежуточные результаты или подготавливаются аргументы для последующих вызовов. Чтобы восстановить стек до возврата, не высчитывая, какую часть стека заняла подпрограмма, нужно скопировать указатель базы в указатель стека, вытолкнуть из стека старое значение ВР и выполнить команду RET.


⇐ Предыдущая страница| |Следующая страница ⇒

.