Локальные переменные

Тема в разделе "WASM.ASSEMBLER", создана пользователем r3load, 5 сен 2004.

  1. Edmond

    Edmond узник замка IF THEN ELSE

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    203
    Адрес:
    WASM.RU
    r3load



    Теперь отвечаю по теме:



    я бы на вашем месте тупо писал


    Код (Text):
    1.  
    2. Mainproc ENDP
    3.  
    4. Test PROC
    5.  
    6.     ;; грубый код
    7.     push ebp
    8.     add esp,size_msg
    9.     mov ebp,esp
    10. msg TEXTEQU <[ebp]>
    11.  
    12. .........
    13.  
    14. Test ENDP
    15.  
     
  2. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    (с) 5 центов Эдмонда.



    Хам ты :) Наглый и необразованный! :)
     
  3. n0p

    n0p 10010000b

    Публикаций:
    0
    Регистрация:
    7 май 2003
    Сообщения:
    256
    Адрес:
    Новосиbeerск
    Вообще, масм не хорош для изучения асма (ИМХО). Там слишком много высокоуровневых фенек, которые сбивают. Я сам начал изучение асма с тасма (в универе), потом продолжил на масме. Потом долго жалел. Когда сел за фасм, я понял, что масм - это почти С. Там от асма осталось совсем мало - инструкции и общая стратегия кода. :) А вот фасм без макросов - это как раз то, что надо для изучения АССЕМБЛЕРА. Может быть потом, когда я буду седым и пузатым, я напишу книжку для детей, где в качестве основного диалекта будет фигурировать именно фасм, как самый ассемблерный ассемблер. Конечно, если к тому моменту не появится чего-нить еще более ассемблерного. :)



    ACTION: прячется под стол и закрывается своей огромной клавой, потому что сейчас полетят банки и подушки: за оффтопик и флейм.



    ЗЫ: Простите меня, у меня был очень тяжелый день.. :))
     
  4. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    r3load >




    Задать таким образом можно, но видется он будет, т.к. в MASM локальными являются только имена меток расположенные внутри PROC / ENDP.

    Все метки, которые определены вне PROC / ENDP имеют глобальную область видимости.

    Решение простое - не использовать идентификатор msd в других местах.

    Т.е. просто выбрать уникальное имя.





    Edmond >




    Там опечатка, нужно так:

    sub esp,size_msg





    n0p >




    Мой кристальный шар показывает, что ты используешь макросы import / library, кучу виндосных структур определённых макросом struct, и макроконстант, определённых через EQU %))))
     
  5. n0p

    n0p 10010000b

    Публикаций:
    0
    Регистрация:
    7 май 2003
    Сообщения:
    256
    Адрес:
    Новосиbeerск
    S_T_A_S_

    Ты прав. :) Я об этом не подумал..

    Я просто стараюсь избежать макросов везде, где это возможно. Не нравится мне эта технология.. :)
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    nop, volodya

    "Важна именно философия"

    Насчет философии согласен, сам грешным делом люблю порассуждать ни о чем и не по теме. Но считаю, что к детским вопросам надо либо относится с пониманием или отсылать их в другое место. Судя по очередному вопросу r3load, он после вашей философии так ничего и не понял (Edmond похоже тоже - add esp,..). Ну и какая польза от наших рассуждений - отшить парня, чтоб не приставал ?



    "Нет понятия "локальная переменная". Есть понятие "переменная на стеке" и нечего тут воду мутить"

    Друзья мои, вы меня умиляете со своим философским подходом. Не поленитесь просмотреть ответы и вы увидете что термин "локальная переменная" подсунул nOp со свого соку... А речь то шла: как определить строку локально в процедуре шоб ее не не было видно извне (не в смысле в дизасме, а в смысле компилера). Я в свавом ответе специально для философов подчеркивал "локальная в том смысле, что..."
     
  7. r3load

    r3load New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2004
    Сообщения:
    5
    Господа, leo особенно,



    мне кажется Edmond был ближе к ответу, чем философтвующие

    на пустом месте, ясно дело, что в ассемблере не может быть локальных переменных,т.к. любой участок памяти с переменными может быть доступен, есть "локальные" , задающиеся тегом LOCAL, "переменные на стеке". Так вот, никто не обратил внимания на то, что я подразумевал процедуру , которая вызывается отдельной нить (Thread-ом), в которой переменные с одним и тем же именем лежат в разных участках памяти.. Суть вопроса была проста - можно ли МАСМ-овским синтаксисом указать имя переменной и задать сразу ее значение, например msg db "Test",0 и чтоб это была "переменная на стеке" . Грубо говоря



    LOCAL msg db "Test",0



    - это нерабочий пример :) , но именно это я имел в виду.
     
  8. irvin

    irvin New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2004
    Сообщения:
    14
    2r3load



    LOCAL msg db "Test",0



    Так ничего не выйдет и не мечтай. LOCAL - это только [esp-n] работает вместе с макросом PROC. Накатай себе другие макросы и кайфуй.
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    r3load

    Научишся задавать четкие вопросы, будешь получать четкие ответы без лишней философии и не через два дня, а чуточку быстрее.



    PS: Из всей этой путанницы я так и не понял, собираешься ты модифицировать строку "Test" в процедуре, или просто передавать как есть в качестве параметра куда-то еще...
     
  10. Edmond

    Edmond узник замка IF THEN ELSE

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    203
    Адрес:
    WASM.RU
    volodya



    Мууррр...



    Тарифы Volodya:



    5 центов: Обругать матом 1 уровня

    5 баксов: ...



    :)))))
     
  11. Edmond

    Edmond узник замка IF THEN ELSE

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    203
    Адрес:
    WASM.RU




    Что за манера подсказывать :) Пусть сами разбирутся :))
     
  12. n0p

    n0p 10010000b

    Публикаций:
    0
    Регистрация:
    7 май 2003
    Сообщения:
    256
    Адрес:
    Новосиbeerск
    А я и не заметил еггога.. :) Привык большую часть кода на автомате писать.. :) При этом код асмовый в голове сразу в логическую цепочку (ака блок-схема) транслируется. Обратно тоже. Потому мне и не ясен ажиотаж вокруг hll.. Грамотно разработанная логика позволит написать хоть на машинном коде, если владеешь скилом нужным.. :) А такие мелочи, как add/sub делаются на автомате (правда, зачастую такая автоматизация - неиссякаемый источник багов-убийц, которых очень сложно найти, зато смешные. :))
     
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Local symbols



    Соглашения об определении local symbols должны присутствовать в любом нормальном диалекте асма (если хочется возразить, то сначала лучше подумать). В тасме для этого есть директива

    LOCALS xy

    которая определяет, что все symbols, начинающиеся с символов xy, будут рассматриваться как local. Если символы xy явно не указаны, то по умолчанию берутся @@. В режиме Ideal - "local symbols are automatically enabled", поэтому без всякой директивы все метки и идентификаторы db, начинающиеся с @@ будут локальными. В режиме MASM - наоборот, по умолчанию отключено.

    Что значит local symbol ? Если идентификатор @@Msg объявлен внутри PROC\ENDP, то

    1) он "невидим" из других процедур, в т.ч. из main - при попытке обращения получаем ERROR: undefined symbol;

    2) можно объявлять одинаковые идентификаторы @@Msg в разных процедурах.



    Вывод: если мы используем строку как "константу" (для вывода в MessageBox и т.п.), то достаточно обеспечить "локальность" ее идентификатора и совершенно не обязательно заталкивать ее в стек. Если же речь идет о создании "локальной" копии строки для ее модификации, ну "тады другое дело" и local scope здесь вроде бы дело вторичное.



    Возражения есть ? Наверное нету..
     
  14. n0p

    n0p 10010000b

    Публикаций:
    0
    Регистрация:
    7 май 2003
    Сообщения:
    256
    Адрес:
    Новосиbeerск
    Ну возражений по поводу самой фишки нету. Но вот ее необходимость..

    ИМХО, настоящему джЫдаю она без надобности. НЕфиг мракобесие плодить локальостью/процедурностью.. Нет ничего кроме меток! А когда мне надо параметры передать - пушаю в стек, потом извлекаю. В общем, процедуры я тоже руками оформляю - есть где урвать пару байтиков. %)
     
  15. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    r3load >




    Можно подробнее, причём здесь трэд? Может быть нужна реентерабельность?

    Чем не устраивает примеры sensy и мой на первой странице?





    n0p >




    Yep! I'm c001 asm0r!! I gonna everithing c0de in HEX!!! =))))





    >




    Это неверно.

    FASM:
    Код (Text):
    1.  
    2. foo:  dd 0
    3. bar   dd 0


    foo - это метка, характеристика одна - адрес.

    bar - это именованная область данных размером с DWORD. Характеристики 2 - адрес и размер.



    mov [bar],2 ; компилируется

    mov [foo],2 ; НЕ компилируется (почему? ;)





    ЗЫ

    А без локальных меток жить нельзя.
     
  16. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    nOp

    Да, ты действительно "суровый" парень. Может ты и метками не пользуешься ? Суровые ребята наверное все rel8\rel32 в уме щелкают как орешки (шутка; вставил бы смайлик, да не обучен самому продвинутому языку тысячелетия, может кто даст ссылочку..)
     
  17. irvin

    irvin New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2004
    Сообщения:
    14
    2r3load



    А как насчет такого прикола.

    Только линковать поумолчанию.



    func proc uses edi esi ebx



    LOCAL buff[4000h]:byte





    lea esi, buff

    mov [esi], word ptr ':)'

    ret



    func endp
     
  18. r3load

    r3load New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2004
    Сообщения:
    5
    irvin



    Yep... Это одно из решений проблеммы.. Только здесь прийдется создавать вордовую или лучше двордовую таблицу значений, которые нужно заносить..
     
  19. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    irvin >





    Этот код не будет работать: перескочим сторожевую страницу
     
  20. irvin

    irvin New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2004
    Сообщения:
    14
    2S_T_A_S_



    А разве я говорил что он будет работать.

    Мне нужно было пару раз большой буфер так я делал так.

    Через задницу но зато работает.



    func proc



    LOCAL buff[4000h]:byte



    add esp, 4000h

    mov eax, 4000h

    call alloca_probe



    push ebx



    lea esi, buff

    mov [esi], word ptr ':)'



    pop ebx



    ret



    func endp