gas Глянь это, правда давно я к ним и фасму не возвращался, не знаю как там с современностью дела обстоят. Была и уменя такая детская болезнь когда-то сейчас если древний исходник на тасме с русскими именами переменных попадается, то даже смотреть на это безобразие неприятно )
Там ничё для меня нового. А можешь обосновать чем РЕАЛЬНО это плохо? У меня вот есть кое-какие аргументы в пользу русского: Главное - чем больше дополнительной информации о символе - тем быстрее мозгом переваривается что это такое. Ведь незря придумали редакторы с раскраской, именно для писания программ. Вот русские имена - это тоже доп.информация о том что функция, макрос, структура и т.п. МОЯ, сделанна мною, и я знаю где её искать. Я вообще большое значение придаю визуализации кода, у меня свои правила по использованию символов, регистра, префиксов, и т.д. И Русские буквы только расширяют возможности визуализации. Правда русские имена кряво смотрятся в виде НажЛевКнМыши. Лучше писать "Нажатие_левой_кнопки_мыши:' Много букв? Ну и чё? В чём проблема? Места на винте мало что-ли... На а скорость написания... Думаю что время на писанину - фигня - капля в море относительно времени на думание. Вот пример моего кода: УСТАНОВИТЬ_БИТ !вход_следующему ПЕРЕХОД_ЕСЛИ_БИТ !активный,сброшен,@f ПЕРЕХОД_ЕСЛИ_БИТ !фокус_закреплён, установлен,@f ПЕРЕХОД_ЕСЛИ_БИТ !нажимаемый,сброшен,@f ЗАГРУЗИТЬ_В_ЗАВИСИМОСТИ_ОТ !нажато,[ebx+_состояние],сост_нормал,сост_нажато ;если бит 0 - грузится предпоследним аргументом, если 1 - последним call Отрисовать @@: mov edi,_лев_кн_отпуск ;смещение указателя на обработчик в контексте элемента jmp .далее Что в этом плохого? Объективно.
т.е. хочешь сказать что после очередного обновления fasm и эти макросы накрылись медным тазиком? Мне это не актуально, поэтому проверять лень, но любопытно А по русскому языку уже был холивар, повторять его не интересно
Вот парочка, первый из fasmlib, второй из fasmpak. Вроде бы разницы между ними нет... но я на всякий случай выложил оба файла. Где-то было ещё пару реализаций, но, думаю, что и эти сойдут. А вообще-то можно написать свои аналоги. Просто на всякий случай. Данные надо вставлять между скобок, и ещё надо вставлять в конец IncludeUData/IncludeIData. Значит секция данных должна быть в конце файла. Лично мне это доставляет неудобство, предпочитаю обходиться ручками. А ещё, если подключены хидеры XP, можно просто писать что-то вроде invoke MessageBox,"It's work!!! Real!!!"
Ну, это ты можешь выяснить элементарно. Тебе ведь надо не display? Верно? А вызывать что-то вроде invoke MessageBox,"Bla-Bla-Bla-Bla" можно, но для этого тебе надо написать свой макрос invoke. Что довольно тривиальная задача, тем более, что макрос для размещения строк в определённом месте у вас уже есть. Код (Text): macro ФЛАГИ ячейка,[имена] { common local n,m n=0 m=1 forward имя equ ячейка,n вес_#имена = m <<<<<<<<<<------------(1) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ n = n+1 m = m*2 } (Похоже, что ниже распологается текст, который реально может тебе помочь) 1. Ты должен понимать, что equ вычисляется предпроцессором, а "=" уже на стадии ассемблирования. Как говориться в мане, то что через "=" "assemble time variables". И получается, что присваивание значений твоим переменным происходит во время компиляции, а на это момент переменная m равна, естественно, последнему числу X( И вообще, хорошим тоном при написании макро считается использование prepsrc, который может тебе показать работу предпроцессора. Искать в папке tool. Если будет совсем уж туго, пиши, помогу.
gas Конечно. Я вобще юзаю макросы, получается типа Код (Text): invoke MessageBox, HWND_DESKTOP, zStr("Text"), zStr("Caption"), MB_OK при этом строки "Text" и "Caption" помещаются в секции данных.
Как раз веса флагов тут подсчитываются и присваиваются правильно. Проверено. Неправильно получается всё что связано с составляющими машинных инструкций. В данном случае всем именам через equ присваивается [адрес_ячейки],n=последнее. Где эта папка?
gas Такая формулировка, что крайне трудно понять, что Вам нужно. Особенно (!) из-за кириллических имён. Так что я полностью согласен с Y_Mur: да... и у меня такая болезнь тоже была, но сейчас считаю кириллические имена абсолютно нечитабельными. Поэтому, если Вам лично и удобно использовать такую кашу, то код, который будете показывать другим, ИМХО в ваших же интересах оформлять более тривиально-консервативно (и не стоит забывать об отступах... иначе нечитабельно => меньшая вероятность, что Вам ответят на вопрос). В общем после 15-минутной медитации над кашей вроде понял, что требуется. Так вот верно всё Z3N говорит: проблема в том, что Вы мешаете в кучу директивы препроцессора и директивы контроля. Этого в большинстве случае не избежать (по крайней мере без этого вся мощь fasm не достижима), но нужно чётко осознавать, что сначала отрабатывает однопроходный препроцессор (только fix здесь слегка особняком), а потом уже многопроходная стадия ассемблирования. Исходя из вышесказанного, теперь должно стать очевидным, что перечисленным именам присваивается не (!) последнее значение n, а сам символ "n". Когда же дело доходит до стадии ассемблирования, то отработавший препроцессор везде вместо соответствующего имени уже подставил этот символ. Теперь на стадии ассемблирования производится бессмысленное перечисление всех значений n от нуля до числа аргументов макроса, после чего n достигает стабильного значения (последнего) и ассемблируется в соответствующее число в исходнике. Один из вариантов workaround'а (если я правильно понял, что требуется): Код (Text): macro flags cell,[name] { common local cntr cntr = 0 forward val_#name = 1 shl cntr val@#name = cntr name equ [cell],val@#name cntr = cntr + 1 } Начиная с версии 1.69 автор также научил считать и препроцессор. Поэтому для более новых версий прокатит также и такой вариант: Код (Text): macro flags cell,[name] { common local cntr cntr equ 0 forward val_#name = 1 shl cntr name equ [cell],cntr rept 1 buf:cntr+1 \{ cntr equ buf \} }
P.S. Хотя красоты ради в последнем примере лучше написать val_#name equ 1 shl cntr вместо val_#name = 1 shl cntr.
Код (Text): macro flags cell,[name] { common local cntr cntr = 0 forward val_#name = 1 shl cntr val@#name = cntr name equ [cell],val@#name cntr = cntr + 1 } Не работает. ФАСМ 1.57 . Но помойму я так же делал и на 1.67 - тоже не работало.
gas А можно по-конкретнее? Что не работает? Если ошибка, то какая, в каком коде? А лучше вообще пример минимального исходника с воспроизводимой ошибкой (плюс текст ошибки). Народ явно обожает растягивать удовольствие ожидания ответа, выдавая информацию по крупицам.
gas Часто стоит только попытаться правильно сформулировать вопрос, как неожиданно оказывается, что ответ находится в правильной постановке самого вопроса.
Можно и даже нужно. Пример: Код (Text): struct point x dd ? y dd ? ends Внимание! virtual at ebx StructAddressedAtEBX point end virtual mov [StructAddressedAtEBX.x],eax ====>[ebx],eax mov [StructAddressedAtEBX.y],ecx ====>[ebx+4],ecx И даже если бы этого не было, можно было бы делать так: Код (Text): struct point x dd ? y dd ? ends mov [point.x+ebx],eax ====>[ebx],eax mov [point.y+ebx],ecx ====>[ebx+4],eax А также, можно было бы сделать что-то наподобие virtual с помощью макросов.
Z3N Типы есть сишные ? У меня например: Код (Text): QueryObject proc Object:HANDLE, Information:PSYSTEM_HANDLE_INFORMATION У вас будет чтото наподобие этого: Код (Text): QueryObject proc Object:DWORD, Information:DWORD Из этого не понять что за параметры.
Clerk Во-первых, ассемблер должен отображать возможности процессора. Процессор не поддерживает никаких HANDLE или PSYSTEM_HANDLE_INFORMATION. Процессор поддерживает DWORD. Смысл в десяти названиях для одного и того же? Во-вторых, если хотите, можете сколько угодно синонимов для DWORD наделать и будет поддерживать. Но опять таки, смысл? Истинный же тип (смысл) переменной должен быть виден из его названия. Иначе каждый раз нужно по всему исходнику искать, а какого же типа переменная была.