|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июл 16, 2004 12:18:08 Перехожу с ТАСМа на ФАСМ.Не пойму как объявить локальные стековые переменные в ФАСМе.Так было в ТАСМе: PROGRAM proc near var_4 = word -4 var_2 = word -2 enter 4, 0 mov [bp + var_4], 1 Теперь в ФАСМ: PROGRAM: var_4 dw -4 var_2 dw -2 enter 4,0 mov [bp + var_4], 1 Получается что в ФАСМе переменные var_2 и var_4 видны во всех процедурах и такое объявление их никак не связано с областью стека, зарезервированной оператором enter.Документация на wasm.ru скудная.Может кто знает как нужно их объявить чтобы они действительно относились к стековой странице оператора "enter 4,0"? |
|
|
Дата: Июл 16, 2004 14:50:35proc FindTargetModule, th32ProcessID, lpszTargetName .hSnapshot dd ? ; <- вот enter invoke CreateToolhelp32Snapshot, TH32CS_SNAPMODULE, [th32ProcessID] cmp eax, -1 je .exit mov [.hSnapshot], eax ............... |
|
|
Дата: Июл 16, 2004 17:56:18 На сколько я знаю эта переменная будет всё же видна из других процедур как FindTargetModule.hSnapshot. |
|
|
Дата: Июл 16, 2004 18:15:49 · Поправил: Asterix pas > На сколько я знаю эта переменная будет всё же видна из других процедур как FindTargetModule.hSnapshot. Если так то это уже глюки fasm'а, если переменная локальная то другим процедурам ею воспользоваться не удастся ;-) |
|
|
Дата: Июл 16, 2004 23:07:04 Это не глюки. Это документацию читать нужно. Если не ошибаюсь, то с этим делом в фасме также как и в насме, а там именно так, как писал pas. |
|
|
Дата: Июл 17, 2004 06:41:09 Не хотелось создавать еще одну тему. Объясните следущую ситуацию - есть следующий код: proc CallWndProc, nCode, wParam, lParam .ps PAINTSTRUCT enter cmp [nCode],HC_ACTION jz .DoWork invoke CallNextHookEx,hook,[nCode],[wParam],[lParam] jmp .Exit .DoWork: mov edx,[lParam] mov edx,[edx] virtual at edx cwp CWPSTRUCT end virtual cmp [cwp.message],WM_PAINT jnz .Processed invoke BeginPaint,[cwp.hwnd],eax .Processed: xor eax,eax .Exit: return endp выдает ошибку, типа не найдена метка .Exit (undefined symbol). Если директиву virtual..end virtual поместить сразу после объявления .ps, то компилиться без проблем. Насколько я понимаю virtual..end virtual - это препроцессорная инструкция, которая просто добавляет метки (смещения). В чем прикол? |
|
|
Дата: Июл 17, 2004 08:25:48 · Поправил: Black_mirror jekyll Должно быть так: virtual at edx .cwp CWPSTRUCT end virtual cmp [.cwp.message],WM_PAINT |
|
|
Дата: Июл 17, 2004 10:17:40 jekyll Хотя Black_mirror уже ответил я дам тут пару ссылок, т.к. недавно были сходные обсуждения, может будет полезно :) http://www.wasm.ru/forum/index.php?action=vthread&forum=3&topic=6473 http://www.wasm.ru/forum/index.php?action=vthread&forum=3&topic=6462&page=1 |
|
|
Дата: Июл 17, 2004 23:43:55 Black_mirror Спасибо. S_T_A_S_ Это я читал. А нормальное объяснение можно? |
|
|
Дата: Июл 18, 2004 08:00:18 Если переменная в любом виде видна из других процедур, то она не является порождением стекового фрэйма, так как команда leave в конце процедуры бесповоротно уничтожает её возвращая стек в исходное положение.А так как она видна после, то на неё тратится в памяти лишнее место. И если вы скажете что это ерунда, тогда зачем мы вообще используем ассемблер?В тасме с этим было всё предельно ясно. Ещё один вопрос - теперь по тасму(из-за чего я захотел перейти на фасм).Если просмотреть exe-шник в IDA,то видно, что тасм в командах переходаx на близкие расстояния оставляет после этой команды два оператора NOP, видно зарезервированные ранее как для дальних переходов, типа: jz m1 nop nop . . m1 Тоже весьма не экономно.Кому нафиг нужон такой ассемблер?Или я не так что-то делаю? |
|
|
Дата: Июл 18, 2004 09:33:01 mercury2002 А так как она видна после, то на неё тратится в памяти лишнее место. Локальные переменные (также как и аргументы функции) занимают память из стека. Метки на локальные переменные, ето не константы, a [ebp+const]. После "leave" остаються только метки и никакая лишьная память не тратиться - стек все равно есть. Конечно използовать ети метки нельзя, потому что ниформация уже искажена (с большой степени вероятности). |
|
|
Дата: Июл 18, 2004 11:47:41 mercury2002 Ещё один вопрос - теперь по тасму(из-за чего я захотел перейти на фасм).Если просмотреть exe-шник в IDA,то видно, что тасм в командах переходаx на близкие расстояния оставляет после этой команды два оператора NOP, видно зарезервированные ранее как для дальних переходов, типа: jz m1 nop nop . . m1 Тоже весьма не экономно.Кому нафиг нужон такой ассемблер?Или я не так что-то делаю? тебе нужен ключ /q - Suppress OBJ records not needed for linking tasm32 /q .... тогда нопов не будет. |
|
|
Дата: Июл 18, 2004 12:26:38 Спасибо, попробую |
|
|
Дата: Июл 18, 2004 12:35:25 Нет не помогло.Сделал так(у меня программа под дос) tasm /q 1line tlink /x 1line , 1line Нопы остались. |
|
|
Дата: Июл 20, 2004 19:02:17 mercury2002 Нопы остались. Не забудь добавить еще и /m2 или больше. Так как тасм при одном (а по умолчанию он один) проходе оптимизацию джампов не проводит. Кстати, можно использовать и jz short m1 |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.054 |