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

 WASM Phorum —› WASM.ASSEMBLER —› tasm2masm migration

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Июл 15, 2004 18:13:37

перехожу с тасма на масм %)
поэтому чайниковский в плане масма вопрос:

tasm syntax
call SomeFunc,offset SomeVar
ret
SomeVar: dd 1234556h

masm syntax
invoke SomeFunc,offset SomeVar
ret
SomeVar: dd 1234556h

масм меня материт что не найдена метка SomeVar.

чувствую что до обращения к ней надо как то указать, что она будет потом определена. поместить физически SomeVar перед вызовом SomeFunc не предлагать.


Дата: Июл 15, 2004 18:22:15

либо SomeVar перед кодом объявляй, и тогда можно addr написать или lea используй


Дата: Июл 15, 2004 18:33:56 · Поправил: S_T_A_S_

Странно, вроде бы похоже на правду.. Если ADDR используется, то тогда точно перед кодом, с offset должно работать. Может так надо:
SomeVar dd 1234556h

А лучше imho переходите на FASM, пока не поздно.
Там всякие offset не надо писать - ни к чему это в Ассемблере :).


Дата: Июл 15, 2004 18:47:09

почему поздно? масм умирать вроде не собирается :)


Дата: Июл 15, 2004 18:53:13

Дык почему этот код-то не компилируется, вроде всё нормально, может с секциями что?
А дальше глюков будет ещё больше :)


Дата: Июл 16, 2004 18:18:53

Дык, если SomeVar - локальная переменная, то она объявляется до invoke, если не локальная, то тем более, и еще ":" ставить не обязательно.


Дата: Июл 16, 2004 20:10:06

Почему же не локальная переменная обязана объявляться раньше invoke?
Это ж ассемблер а не паскаль!


Вот так MASM изволит (!) компилировать:
push offset SomeVar
call SomeFunc
SomeVar dd 1234556h 
А с invoke - нет!


А вот ещё глюк:
SomeVar: dd 1234556h 
syntax error : dd
Двоеточие нельзя :(


Для FASM ни то ни другое проблемой не является ;-)


Дата: Июл 16, 2004 20:27:58

Так:
SomeVar:
dd 1234556h
  invoke SomeFunc, offset SomeVar
  ret

вполне прокатит, т.е. masm должен наперед знать что есть такая метка, кстати тоже самое имеет место при ссылке на процедуры, но если процедуру описать в PROTO то проблема пропадает, может быть можно как-то и метки описать заранее.


Дата: Июл 16, 2004 20:29:22

Глюки, первым делом, следует искать в голове. Раскидывать глобальные переменные по всему коду - идиотизм, и MASM от этого отучит.

>>Двоеточие нельзя :(

Может, вместо двоеточия попробуем целое предложение засунуть? Синтаксиса надо придерживаться.


Дата: Июл 16, 2004 22:34:57

Asterix > „Так: .. вполне прокатит“

Дык! В том-то и дело, MASM порой позволяет делать разумные вещи, но каким-то хм.. не совсем обычным способом =)


__Ranger > „Раскидывать глобальные переменные по всему коду - идиотизм“

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


> „Может, вместо двоеточия попробуем целое предложение засунуть?“

Зачем?
Я привёл простой пример, который прекрасно понимают другие ассемблеры.


> „Синтаксиса надо придерживаться.“

Если говорить о синтаксисе x86, то стандартов не существует в принципе.
Есть преобладание каких-то стандартов нед другими.
В данном случае налицо несовместимость именно MASM с другими ассемблерами, поскольку тех - большенство.
Так что это по большому счёту вопрос - кому/чему какого синтаксиса надо придерживаться.


ЗЫ
Кстати, по поводу синтаксиса ассемблера в частности и ассемблера вообще, сейчас развивается оживлённая дискуссия на board.flatassembler.net
Главные действующие лица - Betov и Randall Hyde %)))


Дата: Июл 16, 2004 23:47:23

>>Почему обязательно будут какие-то переменные.

Изначально речь шла о переменной.

>>Если я, к примеру, хочу передать в подпрограмму в качестве аргумента адрес кода, расположенного позже?

Если хочешь юзать invoke, пиши прототипы. Сразу будет видно, что за функции в этом модуле, и заодно проверка на количество параметров. Опять же в нормальном коде в качестве аргумента кода в 99% будет идти адрес функции. Если нужны какие-то извраты, то, наверное, MASM не лучший выбор.


Дата: Июл 17, 2004 10:13:23

> „Изначально речь шла о переменной. “

Хорошо, сделаю попровочку.
Т.к. я программирую на ассемблере, я привык работать с такими понятиями как метки (адреса).
В коде в самом начале топика метка используется для указания на данные, поэтому я использовал HLL термин переменная.
Нсходя из приведённого контекста нельзя сказать, меняются ли данные по офсету SomeVar.
Вообще какая в принципе разница, адресом чего является SomeVar?


> „Если хочешь юзать invoke, пиши прототипы.“

Как мне это поможет в подобном случае:
MyFun   proc
        invoke  MyAnotherFun, panic
dontpanic:
        .......
panic:
        .......
MyFun   endp

Обращаю внимание, в MyAnotherFun передаётся 2 DWORD'а ;)
Она сама решает какой из них загрузить в EIP позже.


> „Опять же в нормальном коде“.. „Если нужны какие-то извраты“

Неужели ассемблер должен накладывать какие-то ограничения на способы программирования?
Это же не паскаль или бейсик :-/


> „наверное, MASM не лучший выбор.“

Да, поэтому я и ипользую FASM =)


Дата: Июл 17, 2004 13:56:38

„Обращаю внимание, в MyAnotherFun передаётся 2 DWORD'а ;)“
а можно полный пример? И что, фасм такое компилирует и не ругается на panic?
На свалку тогда такой компилятор! Я уже про это не говорю:
„SomeVar: dd 1234556h
syntax error : dd
Двоеточие нельзя :(
Для FASM ни то ни другое проблемой не является ;-)“

Это получается как в старом анекдоте про то как билл гейтс винду написал - положил клаву на стул попрыгал ж. по ней, скомпилировал и на продажу...


Дата: Июл 17, 2004 14:45:20

>>Вообще какая в принципе разница, адресом чего является SomeVar?

Мне кажется, что очень желательно разделять код и данные, иначе могут возникнуть неприятные ошибки.

>>Как мне это поможет в подобном случае:

Я же писал:
>>>>в нормальном коде в качестве аргумента кода в 99% будет идти адрес функции

Т.е всякие EnumChildWindows и т.п. Случай, где может понадобиться адрес произвольного участка кода, мне трудно представить. Возможно это будет какя-то шифровка или другие специфические приемы( что я назвал "извратом").


Дата: Июл 17, 2004 16:06:17 · Поправил: S_T_A_S_

masquer > „а можно полный пример? И что, фасм такое компилирует и не ругается на panic? “

Дык это и был полный пример. Код:
  invoke  MyAnotherFun, panic
dontpanic:

ложит в стек 2 DWORD'a - offset panic и адрес следующей команды, т.е. offset dontpanic.

invoke в MASM в данном случае не переваривает метку panic, т.к. она в тексте находится позже.
Но если делать push offset panic - то всё нормально!
Какой смысл в invoke, если он такой кривой :(
Мне как-то из-за этого пришлось писать свой макрос, иммитирующий его работу, конечно никаких проверок кол-ва аргументов и т.п..

В FASM invoke может ложить в стек и qword'ы и вообще всё что хочешь.
Вернее, что предусмотришь :)


>> „Двоеточие нельзя “
> „Это получается как в старом анекдоте..“

Дык он и MASM так писал :)
Вроде 2 эквивалентные строки, но почему-то одна из них ему не нравится:

foo: nop
bar: db 90h


__Ranger > „Мне кажется, что очень желательно разделять код и данные, иначе могут возникнуть неприятные ошибки.“

Возможно это и так, хотя imho возникновение ошибок связано совершенно с другими вещами, но Как это меняет суть?
Я поросто хочу передать в подпрограмму какой-то адрес, MASM разрешает это сделать только через [beep]


> „Случай, где может понадобиться адрес произвольного участка кода, мне трудно представить.“

Но это же не значит, что таких случаев быть не может. Всё дело в подходе..
Даже пресловутый компилятор в делфи это делает (за спиной конечно), если я не ошибаюсь.



ЗЫ
include	'ext.fi'
!GUI

MessageBox 0, @$ "Hey, INVOKEs are too boring, aren't they?", @$ "FASM rulezZ :)",0
ExitProcess 0

!END

. 1 . 2 . >>


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