Статус
нашего
сайта:
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

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


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

Иногда в процессе вызова подпрограммы значения регистров процессора меняются. В этой связи полезно сделать так, чтобы вызывающая программа не знала о том, какие регистры используются вызываемой программой. Для этого проще всего ввести для системных вызовов и обычных подпрограмм одни и те же соглашения. Предполагается, что в вызываемой программе могут изменяться значения регистров АХ и DX. Если в одном из этих регистров содержится ценная информация, желательно, чтобы вызывающая процедура разместила ее в стеке до выполнения аналогичной операции с аргументами. Если подпрограмма использует и другие регистры, их можно поместить в стек непосредственно в начале ее выполнения и извлечь из него перед запуском команды RET. Таким образом, желательно сделать так, чтобы вызывающая процедура сохраняла значения регистров АХ и DX (если в них содержатся значимые данные), а вызываемая — значения других регистров, которые она перезаписывает.

Системные вызовы и системные подпрограммы

Поскольку программы запускаются поверх операционной системы, при программировании на языке ассемблера не нужно самостоятельно реализовывать операции открытия, закрытия, чтения и записи файлов. Интерпретатор поддерживает семь системных вызовов и пять функций, позволяющих ему работать на разных платформах. Все они перечислены в табл. В.4.

Таблица В,4, Некоторые системные вызовы и подпрограммы UNIX, поддерживаемые интерпретатором

Имя

Аргументы

Возвращаемое значение

Описание

_OPEN

*name, 0/1/2

Дескриптор файла

Открытие файла

_CREAT

*name, *mode

Дескриптор файла

Создание файла

_READ

fd, buf, nbytes

# байт

Чтение п байт (пЬ^еэ) из буфера Ь^

_WRITE

fd, buf, nbytes

# байт

Запись п байт (пЬуіез) из буфера Ь^

_CLOSE

fd

0 в случае успешного выполнения

Закрытие файла с дескриптором fd

_LSEEK

fd, offset(long), 0/1/2

Положение (long)

Перемещение указателя файла

_EXIT

status

 

Закрытие файлов, остановка процесса

_GETCHAR

 

Чтение символа

Чтение символа в файле стандартного ввода

_PUTCHAR

char

Запись байта

Запись символа в файл стандартного вывода

_PRINTF

*format, arg

 

Запись с форматированием в файл стандартного вывода

_SPRINTF

but, *format, arg

 

Запись в буфере Ь^ с форматированием

_SSCANF

buf, *format, arg

 

Чтение аргументов из буфера Ь^

Все эти двенадцать программ запускаются в стандартном порядке вызова: в первую очередь, в стеке в обратном порядке размещаются все необходимые аргументы; затем в стек вводится номер вызова; наконец, выполняется команда системного исключения SYS без операндов. Все необходимые данные, в том числе номер вызова той или иной системной службы, системная программа извлекает из стека. Возвращаемые значения записываются либо в регистр АХ, либо в комбинацию регистров DX : АХ (если они соответствуют длинному слову).

После завершения команды SYS значения всех регистров гарантированно сохраняются. В стеке после вызова остаются и аргументы. Если они не понадобятся для следующего вызова, вызывающая процедура должна скорректировать содержимое указателя стека.

Для удобства имена системных вызовов можно в начале программы определить как константы; в таком случае к ним можно будет обращаться не по номеру, а по имени. Позже мы рассмотрим несколько системных вызовов на примерах, а пока что воздержимся от излишней детализации.


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

.