|
|
| Посл.отвђт | Сообщен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 |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.152 |