adfun.ru
| |
BIGLIB |
| большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно |
|
| |
ФАНТАСТИКА |
| фентези,
фантастика, фантастические повести |
|
| |
ФИЛОСОФИЯ |
книги, которые заставляют
задуматься над окружающим тебя миром.
|
|
| |
МЕДИЦИНА |
медицинские книги,
методички,
народные лечебники |
|
| |
КУЛИНАРИЯ |
рецепты
тортов, консервирование,
все о спиртных
напитках. |
|
| |
СТИХИ |
| стихи популярных
и не очень авторов |
|
| |
ТВОРЧЕСТВО |
| народное творчество,
стихи, песни и т.д. |
|
| |
ЮМОР |
| анекдоты, приколы,
смешные истории |
|
| |
ЭРОТИКА |
| эротические рассказы,
книги о технике секса,
кама-сутра и др. |
|
|
| |
 |
где "элемент" может быть регистром или состоящим из одной лексемы
элементом данных, который можно заносить и извлекать из стека. В
одной процедуре допускается использовать не более 8 элементов.
Например:
.
.
.
myproc PROC PASCAL NEAR
ARG @source:DWORD,@dest:DWORD,@count:WORD
USES cx,si,di,foo
MOV cx,@count
MOV foo,@count
LES di,@dest
LDS si,@source
REP MOVSB
ENDP
.
.
.
О сохранении регистров в языках Си и Паскаль можно подробнее
узнать в Главе 18 и 19.
Оператор USES можно использовать только в тех процедурах,
которые используют языковые соглашения, отличные от NOLANGUAGE.
Вложенные процедуры и правила области действия
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
Хотя вы можете вкладывать одну процедуру в другую, все про-
цедуры имеют глобальную область действия, Например:
.
.
.
test1 PROC FAR
; код процедуры
Турбо Ассемблер 3.0/tasm/#1-2 = 190 =
CALL test2
; код процедуры
RET
test2 PROC NEAR
; код процедуры
RET ; ближний возврат
test2 ENDP
test1 ENDP
.
.
.
В данном примере вне охватывающей процедуры можно вызывать
test1 и test2.
Если вы хотите получить локальные подпроцедуры, используйте
имя с локальной областью действия, например:
.
.
.
LOCALS
test1 PROC FAR ; код процедуры
RET
@test2 PROC NEAR ; код процедуры
RET
@test2 ENDP
test1 ENDP
.
.
.
Примечание: Директива LOCALS разрешает идентификаторы
с локальной областью действия. Подробнее об этом рассказы-
вается в Главе 11.
В данном коде в процедуре test1 вы можете обратиться только
к процедуре @test2. Фактически, если они не находятся в одной и
той же процедуре может существовать несколько процедур с именем
@test2. Например, допустимо следующее:
.
.
.
LOCALS
test1 PROC FAR
MOV si, OFFSET Buffer
CALL @test2
RET
@test2 PROC NEAR ; некоторый код
RET
@test2 ENDP
Турбо Ассемблер 3.0/tasm/#1-2 = 191 =
test2 PROC FAR
MOV si,OFFSET Buffer2
CALL @test2
RET
@test2 PROC NEAR ; некоторый код
RET
@test2 ENDP
test2 ENDP
.
.
.
Следующий код недопустим:
.
.
.
lOCALS
test1 PROC FAR
MOV si,OFFSET Buffer
CALL @test2
RET
test1 ENDP
@test2 PROC NEAR
; код процедуры
RET
@test2 ENDP
.
.
.
так как вызов @test2 задает локальный идентификатор для процедуры
test1, а таких идентификаторов не существует.
Описание процедур методов для объектов
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
При создании процедур методов для объектов применяются неко-
торые специальные соглашения. Процедуры методов объектов должны
иметь возможность должны иметь возможность доступа к объекту, с
которым они работают. Таким образом, в качестве параметра проце-
дуры должен использоваться указатель на объект.
Турбо Ассемблер интерпретирует объекты достаточно гибко и
позволяет использовать для передачи аргументов процедурам методов
разнообразные соглашения. Эти соглашения ограничиваются только
необходимостью взаимодействовать с объектами, создаваемыми на
языке высокого уровня.
Если вы пишете процедуру метода объекта на самом языке Ас-
семблера, то может оказаться полезным использование соглашения,
по которому аргументы передаются через регистры. В этом случае
Турбо Ассемблер 3.0/tasm/#1-2 = 192 =
вам следует написать процедуру метода, воспринимающую указатель
на объект в регистре или паре регистров ES:DI).
Если вы пишете процедуру метода, которая использует соглаше-
ния по интерфейсу языка высокого уровня, то процедура должна
воспринимать указатель объекта в одном из аргументов. Указатель
объекта, передаваемый из объектно-ориентированных языков высокого
уровня (таких как С++), представляет собой неявный аргумент, по-
мещаемый в начало списка аргументов. Процедура метода, написанная
на языке Ассемблера, должна явно включать в список аргументов
указатель объекта. В противном случае вы можете получить непред-
виденные результаты. Нужно помнить, что в зависимости от того,
является ли объект ближним (NEAR) или дальним (FAR), указатель
может быть величиной WORD или DWORD.
Когда вы пишете на языке Ассемблера конструктор или деструк-
тор, могут возникнуть другие сложности. Чтобы указать, что конс-
труктор или деструктор должен выполнять определенные действия,
С++ использует (при некоторых обстоятельствах) использует другие
неявные аргументы.
Примечание: Об используемых в С++ соглашениях по вызо-
ву рассказывается в Главе 18.
Конструкторам, написанным на языке Ассемблера, не обязатель-
но требуется передавать указатель на объект. Если объект никогда
не распределяется статически, то конструктор объекта всегда будет
выделять для объекта память из динамически распределяемой облас-
ти.
Турбо Ассемблер 3.0/tasm/#1-2 = 193 =
Глава 11. Управление областью действия идентификаторов
ДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДД
В Турбо Ассемблере и большинстве других языков программиро-
вания идентификатор в зависимости от того, где он находится в мо-
дуле, может иметь разное значение. Например, некоторые
идентификаторы могут иметь одно и то же значение во всем модуле,
а другие определены только для конкретной процедуры.
Под областью действия понимается диапазон строк, в котором
идентификатор имеет определенное значение. Для разработки прог-
рамм, использующих принципы модульного программирования, правиль-
|
adfun.ru
|
|
|
|