Область действия аргументов и имен локальных переменных
Если вы не задаете для них имена с предшествующий префиксом локального идентификатора, все аргументы, заданные в заголовке процедуры, определены ли они с помощью директивы ARG (передаваемые аргументы), RETURN (возвращаемые аргументы) или LOCAL (локальные переменные) имеют глобальную область действия.
Идентификаторы с локальной областью действия разрешает директива LOCALS. Например:
. . . LOCALS test1 PROC PASCAL FAR ARG @a:WORD,@d:WORD,@c:BYTE LOCAL @x:WORD,@y:DWORD MOV ax,@a MOV @x,ax LES di,@b MOV WORD ptr @y,di MOV WORD ptr @y+2,es MOV @c,"a" RET ENDP
test2 PROC PASCAL FAR ARG @a:DWORD,@b:BYTE LOCAL @x:WORD LES di,@a MOV ax,es:[di] MOV @x,ax CMP a1,@b jz @dn MVO @x,0 @dn: MOV ax,@x RET ENDP . . .
Примечание: Об управлении областью действия идентифи каторов подробнее рассказывается в этой главе.
Поскольку в данном примере используются переменные локальной области действия, их имена существуют только в теле процедуры. Таким образом, в test2 можно снова использовать имена @a, @b и @x.
Сохранение регистров
Большинство языков высокого уровня требуют, чтобы вызываемые процедуры сохраняли определенные регистры. Это можно сделать, занося их в стек в начале процедуры и извлекая из стека в конце процедуры.
Турбо Ассемблер может автоматически генерировать код для сохранения и восстановления этих регистров, который включается в код начала и завершения. Эти регистры можно указать в операторе USES, который имеет следующий синтаксис:
USES элемент [,элемент] .
где "элемент" может быть регистром или состоящим из одной лексемы элементом данных, который можно заносить и извлекать из стека. В одной процедуре допускается использовать не более 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 . . .
О сохранении регистров в языках Си и Паскаль можно подробнее узнать в тих главах: 1 и 2.
Оператор USES можно использовать только в тех процедурах, которые используют языковые соглашения, отличные от NOLANGUAGE.
1 2 3 4 5
8 8 8
|