· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› FASM.Объявление стековых переменных

. 1 . 2 . >>

Посл.отвђт Сообщен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:35

proc 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

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.054