локальные переменные в процедурах

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
Аватара пользователя
olla-la
Сообщения: 9
Зарегистрирован: 23 мар 2008, 15:20

как задаются локальные переменные в процедурах?
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

в ассемблере нет понятия локальных и глобальных переменных, так же как процедур и функций. Есть понятие - адрес, вы можете зарезервировать место для переменной обычной директивой db и задать этому месту уникальное имя.
It's a long way to the top if you wanna rock'n'roll
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

LOCAL директива в стеке создает
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

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:'
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Не вижу смысла и пользы в директиве Local. Все это попахивает плавным отъездом ассемблера в сторону языков высокого уровня.
It's a long way to the top if you wanna rock'n'roll
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

А Я наоборот в последнее время склоняюсь к директивам MASM код становится понятнее :)
Аватара пользователя
olla-la
Сообщения: 9
Зарегистрирован: 23 мар 2008, 15:20

у меня задание: в процедуре задать какуюнибудь переменную локально. чтобы эта переменная использовалась только в процедуре, а не во всей программе
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

somewhere писал(а):Не вижу смысла и пользы в директиве Local. Все это попахивает плавным отъездом ассемблера в сторону языков высокого уровня.
Скажем, если в процедуре используешь метки, то Locals весьма удобны. Так как если программа немаленькая, то надо каждый раз придумывать какую-то уникальную (для всей программы!) метку. А с помощью Locals уникальность [идентификатора] должна соблюдаться лишь внутри этой процедуры.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Не, насчет этого я не парюсь никогда. Уникальность меток соблюдается без проблем, если придерживаться каких то своих правил написания кода. Например:
Процедура 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
Ответить