r3load Теперь отвечаю по теме: я бы на вашем месте тупо писал Код (Text): Mainproc ENDP Test PROC ;; грубый код push ebp add esp,size_msg mov ebp,esp msg TEXTEQU <[ebp]> ......... Test ENDP
Вообще, масм не хорош для изучения асма (ИМХО). Там слишком много высокоуровневых фенек, которые сбивают. Я сам начал изучение асма с тасма (в универе), потом продолжил на масме. Потом долго жалел. Когда сел за фасм, я понял, что масм - это почти С. Там от асма осталось совсем мало - инструкции и общая стратегия кода. А вот фасм без макросов - это как раз то, что надо для изучения АССЕМБЛЕРА. Может быть потом, когда я буду седым и пузатым, я напишу книжку для детей, где в качестве основного диалекта будет фигурировать именно фасм, как самый ассемблерный ассемблер. Конечно, если к тому моменту не появится чего-нить еще более ассемблерного. ACTION: прячется под стол и закрывается своей огромной клавой, потому что сейчас полетят банки и подушки: за оффтопик и флейм. ЗЫ: Простите меня, у меня был очень тяжелый день.. )
r3load > Задать таким образом можно, но видется он будет, т.к. в MASM локальными являются только имена меток расположенные внутри PROC / ENDP. Все метки, которые определены вне PROC / ENDP имеют глобальную область видимости. Решение простое - не использовать идентификатор msd в других местах. Т.е. просто выбрать уникальное имя. Edmond > Там опечатка, нужно так: sub esp,size_msg n0p > Мой кристальный шар показывает, что ты используешь макросы import / library, кучу виндосных структур определённых макросом struct, и макроконстант, определённых через EQU %))))
S_T_A_S_ Ты прав. Я об этом не подумал.. Я просто стараюсь избежать макросов везде, где это возможно. Не нравится мне эта технология..
nop, volodya "Важна именно философия" Насчет философии согласен, сам грешным делом люблю порассуждать ни о чем и не по теме. Но считаю, что к детским вопросам надо либо относится с пониманием или отсылать их в другое место. Судя по очередному вопросу r3load, он после вашей философии так ничего и не понял (Edmond похоже тоже - add esp,..). Ну и какая польза от наших рассуждений - отшить парня, чтоб не приставал ? "Нет понятия "локальная переменная". Есть понятие "переменная на стеке" и нечего тут воду мутить" Друзья мои, вы меня умиляете со своим философским подходом. Не поленитесь просмотреть ответы и вы увидете что термин "локальная переменная" подсунул nOp со свого соку... А речь то шла: как определить строку локально в процедуре шоб ее не не было видно извне (не в смысле в дизасме, а в смысле компилера). Я в свавом ответе специально для философов подчеркивал "локальная в том смысле, что..."
Господа, leo особенно, мне кажется Edmond был ближе к ответу, чем философтвующие на пустом месте, ясно дело, что в ассемблере не может быть локальных переменных,т.к. любой участок памяти с переменными может быть доступен, есть "локальные" , задающиеся тегом LOCAL, "переменные на стеке". Так вот, никто не обратил внимания на то, что я подразумевал процедуру , которая вызывается отдельной нить (Thread-ом), в которой переменные с одним и тем же именем лежат в разных участках памяти.. Суть вопроса была проста - можно ли МАСМ-овским синтаксисом указать имя переменной и задать сразу ее значение, например msg db "Test",0 и чтоб это была "переменная на стеке" . Грубо говоря LOCAL msg db "Test",0 - это нерабочий пример , но именно это я имел в виду.
2r3load LOCAL msg db "Test",0 Так ничего не выйдет и не мечтай. LOCAL - это только [esp-n] работает вместе с макросом PROC. Накатай себе другие макросы и кайфуй.
r3load Научишся задавать четкие вопросы, будешь получать четкие ответы без лишней философии и не через два дня, а чуточку быстрее. PS: Из всей этой путанницы я так и не понял, собираешься ты модифицировать строку "Test" в процедуре, или просто передавать как есть в качестве параметра куда-то еще...
А я и не заметил еггога.. Привык большую часть кода на автомате писать.. При этом код асмовый в голове сразу в логическую цепочку (ака блок-схема) транслируется. Обратно тоже. Потому мне и не ясен ажиотаж вокруг hll.. Грамотно разработанная логика позволит написать хоть на машинном коде, если владеешь скилом нужным.. А такие мелочи, как add/sub делаются на автомате (правда, зачастую такая автоматизация - неиссякаемый источник багов-убийц, которых очень сложно найти, зато смешные. )
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 здесь вроде бы дело вторичное. Возражения есть ? Наверное нету..
Ну возражений по поводу самой фишки нету. Но вот ее необходимость.. ИМХО, настоящему джЫдаю она без надобности. НЕфиг мракобесие плодить локальостью/процедурностью.. Нет ничего кроме меток! А когда мне надо параметры передать - пушаю в стек, потом извлекаю. В общем, процедуры я тоже руками оформляю - есть где урвать пару байтиков. %)
r3load > Можно подробнее, причём здесь трэд? Может быть нужна реентерабельность? Чем не устраивает примеры sensy и мой на первой странице? n0p > Yep! I'm c001 asm0r!! I gonna everithing c0de in HEX!!! =)))) > Это неверно. FASM: Код (Text): foo: dd 0 bar dd 0 foo - это метка, характеристика одна - адрес. bar - это именованная область данных размером с DWORD. Характеристики 2 - адрес и размер. mov [bar],2 ; компилируется mov [foo],2 ; НЕ компилируется (почему? ЗЫ А без локальных меток жить нельзя.
nOp Да, ты действительно "суровый" парень. Может ты и метками не пользуешься ? Суровые ребята наверное все rel8\rel32 в уме щелкают как орешки (шутка; вставил бы смайлик, да не обучен самому продвинутому языку тысячелетия, может кто даст ссылочку..)
2r3load А как насчет такого прикола. Только линковать поумолчанию. func proc uses edi esi ebx LOCAL buff[4000h]:byte lea esi, buff mov [esi], word ptr '' ret func endp
irvin Yep... Это одно из решений проблеммы.. Только здесь прийдется создавать вордовую или лучше двордовую таблицу значений, которые нужно заносить..
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