Страница 1 из 1
локальные переменные в процедурах
Добавлено: 07 май 2008, 23:27
olla-la
как задаются локальные переменные в процедурах?
Re: локальные переменные в процедурах
Добавлено: 08 май 2008, 09:41
somewhere
в ассемблере нет понятия локальных и глобальных переменных, так же как процедур и функций. Есть понятие - адрес, вы можете зарезервировать место для переменной обычной директивой db и задать этому месту уникальное имя.
Re: локальные переменные в процедурах
Добавлено: 08 май 2008, 11:41
airyashov
LOCAL директива в стеке создает
локальные переменные в процедурах
Добавлено: 08 май 2008, 11:41
BBB
somewhere, может
olla-la спрашивает, как ограничить область видимости переменной с точки зрения компилятора?
Помнится, есть такая директива
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
Но стоит приписать внутри процедуры магические слова
Locals @@:
Код: Выделить всё
.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:'
Re: локальные переменные в процедурах
Добавлено: 08 май 2008, 13:09
somewhere
Не вижу смысла и пользы в директиве Local. Все это попахивает плавным отъездом ассемблера в сторону языков высокого уровня.
Re: локальные переменные в процедурах
Добавлено: 08 май 2008, 14:33
airyashov
А Я наоборот в последнее время склоняюсь к директивам MASM код становится понятнее

Re: локальные переменные в процедурах
Добавлено: 08 май 2008, 19:30
olla-la
у меня задание: в процедуре задать какуюнибудь переменную локально. чтобы эта переменная использовалась только в процедуре, а не во всей программе
.
Добавлено: 12 май 2008, 10:54
BBB
somewhere писал(а):Не вижу смысла и пользы в директиве Local. Все это попахивает плавным отъездом ассемблера в сторону языков высокого уровня.
Скажем, если в процедуре используешь метки, то Locals весьма удобны. Так как если программа немаленькая, то надо каждый раз придумывать какую-то уникальную (для всей программы!) метку. А с помощью Locals уникальность [идентификатора] должна соблюдаться лишь внутри этой процедуры.
Re: локальные переменные в процедурах
Добавлено: 12 май 2008, 11:27
somewhere
Не, насчет этого я не парюсь никогда. Уникальность меток соблюдается без проблем, если придерживаться каких то своих правил написания кода. Например:
Процедура KBD_CheckKeyboardState
Метки @kbd_cks_1, @kbd_cks_2, @kbd_cks_loop и т.д.
Процедура VID_SetTextureAlternatePixelsCenter
Метки @vid_stapc_1, @vid_stapc_exit, @vid_stapc_feedback и т.д.
И названия меток в этом случае отражают и принадлежность процедуре и краткое назначение. Как ни крути, а все эти макрокоманды и директивы - порождение лени и внутреннего желания человека облегчить себе жизнь. Каждая программа на асме - это произведение искусства, она уникальна, в отличие от "штампованых" программ на языках высокого уровня. Это также как сравнивать эрмитаж и обычный панельный дом - одинаковых домов много, а эрмитаж - один.