локальные переменные в процедурах
Модератор: Andy
как задаются локальные переменные в процедурах?
в ассемблере нет понятия локальных и глобальных переменных, так же как процедур и функций. Есть понятие - адрес, вы можете зарезервировать место для переменной обычной директивой db и задать этому месту уникальное имя.
It's a long way to the top if you wanna rock'n'roll
LOCAL директива в стеке создает
somewhere, может olla-la спрашивает, как ограничить область видимости переменной с точки зрения компилятора?
Помнится, есть такая директива Locals. Вроде бы, обычно ее используют для поименования меток. Но я попробовал, как будто и для переменных проходит.
Например (пробовал Tasm-ом, вер.3.2, какая нашлась в дистрибутиве Borland Pascal-я).
Вот этот текст Tasm компилит без ошибок:
Но стоит приписать внутри процедуры магические слова Locals @@:
, как получаем ошибку:
**Error** MYASM.ASM(14) Undefined symbol: @@TESTVARIABLE
14-я строка - это как раз следующая за строкой 'Start:'
Помнится, есть такая директива Locals. Вроде бы, обычно ее используют для поименования меток. Но я попробовал, как будто и для переменных проходит.
Например (пробовал Tasm-ом, вер.3.2, какая нашлась в дистрибутиве Borland Pascal-я).
Вот этот текст Tasm компилит без ошибок:
Код: Выделить всё
.model tiny
.Code
Org 100h
TestProc Proc Near
mov Al, @@TestVariable
ret
@@TestVariable db 0
TestProc EndP
Start:
mov Al, @@TestVariable
Ret
End Start
Код: Выделить всё
.model tiny
.Code
Org 100h
TestProc Proc Near
Locals @@
mov Al, @@TestVariable
ret
@@TestVariable db 0
TestProc EndP
Start:
mov Al, @@TestVariable
Ret
End Start
**Error** MYASM.ASM(14) Undefined symbol: @@TESTVARIABLE
14-я строка - это как раз следующая за строкой 'Start:'
Не вижу смысла и пользы в директиве Local. Все это попахивает плавным отъездом ассемблера в сторону языков высокого уровня.
It's a long way to the top if you wanna rock'n'roll
А Я наоборот в последнее время склоняюсь к директивам MASM код становится понятнее 

у меня задание: в процедуре задать какуюнибудь переменную локально. чтобы эта переменная использовалась только в процедуре, а не во всей программе
Скажем, если в процедуре используешь метки, то Locals весьма удобны. Так как если программа немаленькая, то надо каждый раз придумывать какую-то уникальную (для всей программы!) метку. А с помощью Locals уникальность [идентификатора] должна соблюдаться лишь внутри этой процедуры.somewhere писал(а):Не вижу смысла и пользы в директиве Local. Все это попахивает плавным отъездом ассемблера в сторону языков высокого уровня.
Не, насчет этого я не парюсь никогда. Уникальность меток соблюдается без проблем, если придерживаться каких то своих правил написания кода. Например:
Процедура KBD_CheckKeyboardState
Метки @kbd_cks_1, @kbd_cks_2, @kbd_cks_loop и т.д.
Процедура VID_SetTextureAlternatePixelsCenter
Метки @vid_stapc_1, @vid_stapc_exit, @vid_stapc_feedback и т.д.
И названия меток в этом случае отражают и принадлежность процедуре и краткое назначение. Как ни крути, а все эти макрокоманды и директивы - порождение лени и внутреннего желания человека облегчить себе жизнь. Каждая программа на асме - это произведение искусства, она уникальна, в отличие от "штампованых" программ на языках высокого уровня. Это также как сравнивать эрмитаж и обычный панельный дом - одинаковых домов много, а эрмитаж - один.
Процедура KBD_CheckKeyboardState
Метки @kbd_cks_1, @kbd_cks_2, @kbd_cks_loop и т.д.
Процедура VID_SetTextureAlternatePixelsCenter
Метки @vid_stapc_1, @vid_stapc_exit, @vid_stapc_feedback и т.д.
И названия меток в этом случае отражают и принадлежность процедуре и краткое назначение. Как ни крути, а все эти макрокоманды и директивы - порождение лени и внутреннего желания человека облегчить себе жизнь. Каждая программа на асме - это произведение искусства, она уникальна, в отличие от "штампованых" программ на языках высокого уровня. Это также как сравнивать эрмитаж и обычный панельный дом - одинаковых домов много, а эрмитаж - один.
It's a long way to the top if you wanna rock'n'roll