Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Локальные переменные


Автор: <Spawn> 27.10.2004, 16:35
Есть проблемка в передаче локальной адреса локально переменной функции GetWindowRect(Использую TASM). Самого кода щас нет, но вот примерное его формирование:

Код

SOMEPROC PROC
LOCAL REC: RECT
...
PUSH OFFSET REC
...
CALL GetWindowRect
...

SOMEPROC ENDP


Если переменную меняю на глобальную, то все ок. В чем может быть дело?

Автор: p0s0l 27.10.2004, 16:58
Попробуй так:
lea eax, [REC]
push eax

т.к. локальные переменные находятся в стеке, и offset REC даст скорее всего смещение относительно esp... Не знаю точно...
Вместо lea eax, [REC] скомпилится что-нибудь тиа: lea eax, [esp + $10] к примеру, и тогда можешь уже передавать этот адрсе GetWindowRect


Автор: Akina 27.10.2004, 17:21
p0s0l прав. Просто вызывать локальную переменную надо из сегмента стека:

override SS = DB 36h

или использовать FAR-указатели:

push SS
push OFFSET REC

Автор: <Spawn> 28.10.2004, 11:17
Спасибо, попробую при первой возможности.

Автор: <Spawn> 30.10.2004, 10:05
После 30 минут сборки\проверки\краха проги, сократил процедурину до:

Код
SOMEPROC PROC
 LOCAL REC: RECT

 RET
SOMEPROC ENDP


Даже при таком раскладе генерица ошибка вызова фукции. Как коментирую LOCAL все работает. Наверное ето простой вопрос, но все же в чем дело?

Автор: oleg1973 30.10.2004, 13:34
с тасмом не дружу сильно :(
на Fasm будет так
Код

proc SomeProc,var1,var2
enter
mov eax,[var1]
return
endp

и все
переменные /параметры фунуции через стек идут
при компиляции получим
push ebp
mov ebp,esp
mov eax,[ebp+4]

не знаю поможет ли тебе это

Автор: <Spawn> 4.11.2004, 19:07
oleg1973Спасибо, но проблемы пока не решилась. Уже не занаю что делать. Заметил еще одну особенность: Если в функцию не передавать параметров, то объявление локальных переменных не вызывает ошибки:

Код

SomeProc proc
 local w: dw
 ..
 ret
SomeProc endp


При передаче параметров в функцию программа просто вылетает, с сообщением, что создан журнал ошибок.

Код

push <что то кладем в стек>
call SomeProc

SomeProc proc
 local w: dw
 ..
 ret 4
SomeProc endp

Автор: oleg1973 4.11.2004, 22:28
Код

386
.model flat, stdcall

someshit PROTO   :DWORD,:DWORD

.code
start:
   push 0
       push 0
   call someshit
     ret
     
someshit proc var:dword,var1:dword
Local fuck:dword

       mov eax,var
       mov eax,fuck

       ret
someshit endp

end start



masm32 v 8.2
все пашет

Автор: <Spawn> 23.11.2004, 15:23
Спасибо, с MASM-ом все заработало

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)