|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Сен 7, 2004 15:49:01 · Поправил: Edmond Там опечатка, нужно так: Что за манера подсказывать :) Пусть сами разбирутся :)) |
|
|
Дата: Сен 7, 2004 21:09:52 А я и не заметил еггога.. :) Привык большую часть кода на автомате писать.. :) При этом код асмовый в голове сразу в логическую цепочку (ака блок-схема) транслируется. Обратно тоже. Потому мне и не ясен ажиотаж вокруг hll.. Грамотно разработанная логика позволит написать хоть на машинном коде, если владеешь скилом нужным.. :) А такие мелочи, как add/sub делаются на автомате (правда, зачастую такая автоматизация - неиссякаемый источник багов-убийц, которых очень сложно найти, зато смешные. :)) |
|
|
Дата: Сен 7, 2004 22:42:11 · Поправил: leo 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 здесь вроде бы дело вторичное. Возражения есть ? Наверное нету.. |
|
|
Дата: Сен 7, 2004 23:37:00 Ну возражений по поводу самой фишки нету. Но вот ее необходимость.. ИМХО, настоящему джЫдаю она без надобности. НЕфиг мракобесие плодить локальостью/процедурностью.. Нет ничего кроме меток! А когда мне надо параметры передать - пушаю в стек, потом извлекаю. В общем, процедуры я тоже руками оформляю - есть где урвать пару байтиков. %) |
|
|
Дата: Сен 8, 2004 04:11:33 r3load > Так вот, никто не обратил внимания на то, что я подразумевал процедуру , которая вызывается отдельной нить (Thread-ом), в которой переменные с одним и тем же именем лежат в разных участках памяти.. Можно подробнее, причём здесь трэд? Может быть нужна реентерабельность? Чем не устраивает примеры sensy и мой на первой странице? n0p > настоящему джЫдаю она без надобности. Yep! I'm c001 asm0r!! I gonna everithing c0de in HEX!!! =)))) > Нет ничего кроме меток! Это неверно. FASM: foo: dd 0 bar dd 0 foo - это метка, характеристика одна - адрес. bar - это именованная область данных размером с DWORD. Характеристики 2 - адрес и размер. mov [bar],2 ; компилируется mov [foo],2 ; НЕ компилируется (почему? ;) ЗЫ А без локальных меток жить нельзя. |
|
|
Дата: Сен 8, 2004 09:53:58 nOp Да, ты действительно "суровый" парень. Может ты и метками не пользуешься ? Суровые ребята наверное все rel8\rel32 в уме щелкают как орешки (шутка; вставил бы смайлик, да не обучен самому продвинутому языку тысячелетия, может кто даст ссылочку..) |
|
|
Дата: Сен 8, 2004 11:52:28 2r3load А как насчет такого прикола. Только линковать поумолчанию. func proc uses edi esi ebx LOCAL buff[4000h]:byte lea esi, buff mov [esi], word ptr ':)' ret func endp |
|
|
Дата: Сен 8, 2004 12:39:27 irvin Yep... Это одно из решений проблеммы.. Только здесь прийдется создавать вордовую или лучше двордовую таблицу значений, которые нужно заносить.. |
|
|
Дата: Сен 8, 2004 17:39:38 irvin > LOCAL buff[4000h]:byte Этот код не будет работать: перескочим сторожевую страницу |
|
|
Дата: Сен 8, 2004 17:55:44 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 |
|
|
Дата: Сен 8, 2004 20:10:27 · Поправил: S_T_A_S_ irvin Есть более естественные пути :). Примерно так: mov ESI, 0x200000;
VirtualAlloc(0,ESI,MEM_COMMIT,PAGE_READWRITE);
lea ESP,[EAX+ESI]; // New Stack
mov [FS:4],ESP;//StackBase Upper Address
mov [FS:8],EAX;//StackLimit Lower Address |
|
|
Дата: Сен 8, 2004 20:17:13 2S_T_A_S_ Когда прога создает очень много тредов с сокетами. С твоим вариантом снронизаця задолбет. |
|
|
Дата: Сен 8, 2004 21:32:32 Ага, лучше время от времени вываливаться по exception? Если стэк небольшой можно ж пробежаться по страницам, пусть виндос сам их подключает:
LOCAL buff[4000h]:byte
mov buff[3000h],eax
mov buff[2000h],eax
..... ; гм.. лучше уж пролог / эпилог переопределить
И ещё. Зачем это? lea esi, buff mov [esi], word ptr ':)' При стандартном прологе в MASM нужный адрес уже и так в EBP лежит. |
|
|
Дата: Сен 8, 2004 21:52:44 Вот в том-то и дело что у меня было с (VirtualAlloc) и "время от времени вываливаться по exception". Потом запихал все в стек и проблема кончилась. А пример этот надуманный, реальный тред он очень большой. Если стэк небольшой можно ж пробежаться по страницам, пусть виндос сам их подключает: Функция (alloca_probe) это как раз и делает. Насчет прологов и эпилогов - еще очень хочется побыстрее чтоб работало. |
|
|
Дата: Сен 9, 2004 00:36:13 irvin > Вот в том-то и дело что у меня было с (VirtualAlloc) и "время от времени вываливаться по exception" Дык наверное, не вовремя VirtualFree вызывалась.. У меня VirtualAlloc вызывается для выделения нового стека. Поскольку размер обычного меня иногда не устраевает :). |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.081 |