FASM

Тема в разделе "WASM.BEGINNERS", создана пользователем gas, 25 апр 2010.

  1. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    gas
    Глянь это, правда давно я к ним и фасму не возвращался, не знаю как там с современностью дела обстоят.

    Была и уменя такая детская болезнь когда-то :) сейчас если древний исходник на тасме с русскими именами переменных попадается, то даже смотреть на это безобразие неприятно :))
     
  2. gas

    gas New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2010
    Сообщения:
    52
    Там ничё для меня нового.

    А можешь обосновать чем РЕАЛЬНО это плохо?
    У меня вот есть кое-какие аргументы в пользу русского:
    Главное - чем больше дополнительной информации о символе - тем быстрее мозгом переваривается что это такое. Ведь незря придумали редакторы с раскраской, именно для писания программ. Вот русские имена - это тоже доп.информация о том что функция, макрос, структура и т.п. МОЯ, сделанна мною, и я знаю где её искать. Я вообще большое значение придаю визуализации кода, у меня свои правила по использованию символов, регистра, префиксов, и т.д. И Русские буквы только расширяют возможности визуализации.
    Правда русские имена кряво смотрятся в виде НажЛевКнМыши. Лучше писать "Нажатие_левой_кнопки_мыши:' Много букв? Ну и чё? В чём проблема? Места на винте мало что-ли... На а скорость написания... Думаю что время на писанину - фигня - капля в море относительно времени на думание.

    Вот пример моего кода:
    УСТАНОВИТЬ_БИТ !вход_следующему
    ПЕРЕХОД_ЕСЛИ_БИТ !активный,сброшен,@f
    ПЕРЕХОД_ЕСЛИ_БИТ !фокус_закреплён, установлен,@f
    ПЕРЕХОД_ЕСЛИ_БИТ !нажимаемый,сброшен,@f
    ЗАГРУЗИТЬ_В_ЗАВИСИМОСТИ_ОТ !нажато,[ebx+_состояние],сост_нормал,сост_нажато ;если бит 0 - грузится предпоследним аргументом, если 1 - последним
    call Отрисовать
    @@: mov edi,_лев_кн_отпуск ;смещение указателя на обработчик в контексте элемента
    jmp .далее


    Что в этом плохого? Объективно.
     
  3. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    т.е. хочешь сказать что после очередного обновления fasm и эти макросы накрылись медным тазиком?
    Мне это не актуально, поэтому проверять лень, но любопытно ;)

    А по русскому языку уже был холивар, повторять его не интересно ;)
     
  4. gas

    gas New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2010
    Сообщения:
    52
    Нет. Я там бегло посмотрел и мне показалось что это не то что мне нужно.
     
  5. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Вот парочка, первый из fasmlib, второй из fasmpak.
    Вроде бы разницы между ними нет... но я на всякий случай выложил оба файла.
    Где-то было ещё пару реализаций, но, думаю, что и эти сойдут.
    А вообще-то можно написать свои аналоги.

    Просто на всякий случай.
    Данные надо вставлять между скобок, и ещё надо вставлять в конец IncludeUData/IncludeIData.
    Значит секция данных должна быть в конце файла. Лично мне это доставляет неудобство, предпочитаю обходиться ручками.

    А ещё, если подключены хидеры XP, можно просто писать что-то вроде invoke MessageBox,"It's work!!! Real!!!"
     
  6. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Из фасмпак
     
  7. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Ну, это ты можешь выяснить элементарно.

    Тебе ведь надо не display? Верно?
    А вызывать что-то вроде invoke MessageBox,"Bla-Bla-Bla-Bla" можно, но для этого тебе надо написать свой макрос invoke. Что довольно тривиальная задача, тем более, что макрос для размещения строк в определённом месте у вас уже есть.

    Код (Text):
    1. macro ФЛАГИ  ячейка,[имена]
    2. {
    3. common
    4. local n,m
    5. n=0
    6. m=1
    7. forward
    8. имя equ ячейка,n
    9. вес_#имена = m <<<<<<<<<<------------(1)
    10. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    11. n = n+1
    12. m = m*2
    13. }
    (Похоже, что ниже распологается текст, который реально может тебе помочь)

    1. Ты должен понимать, что equ вычисляется предпроцессором, а "=" уже на стадии ассемблирования. Как говориться в мане, то что через "=" "assemble time variables". И получается, что присваивание значений твоим переменным происходит во время компиляции, а на это момент переменная m равна, естественно, последнему числу X(

    И вообще, хорошим тоном при написании макро считается использование prepsrc, который может тебе показать работу предпроцессора. Искать в папке tool.

    Если будет совсем уж туго, пиши, помогу.
     
  8. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    gas
    Конечно. Я вобще юзаю макросы, получается типа
    Код (Text):
    1. invoke MessageBox, HWND_DESKTOP, zStr("Text"), zStr("Caption"), MB_OK
    при этом строки "Text" и "Caption" помещаются в секции данных.
     
  9. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    А что, в фасме нет assume?
    Как тогда работать со структурами? Считать смещения?
     
  10. gas

    gas New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2010
    Сообщения:
    52
    Как раз веса флагов тут подсчитываются и присваиваются правильно. Проверено. Неправильно получается всё что связано с составляющими машинных инструкций. В данном случае всем именам через equ присваивается [адрес_ячейки],n=последнее.


    Где эта папка?
     
  11. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    gas
    Такая формулировка, что крайне трудно понять, что Вам нужно. Особенно (!) из-за кириллических имён. Так что я полностью согласен с Y_Mur: да... и у меня такая болезнь тоже была, но сейчас считаю кириллические имена абсолютно нечитабельными. Поэтому, если Вам лично и удобно использовать такую кашу, то код, который будете показывать другим, ИМХО в ваших же интересах оформлять более тривиально-консервативно (и не стоит забывать об отступах... иначе нечитабельно => меньшая вероятность, что Вам ответят на вопрос).

    В общем после 15-минутной медитации над кашей вроде понял, что требуется. :) Так вот верно всё Z3N говорит: проблема в том, что Вы мешаете в кучу директивы препроцессора и директивы контроля. Этого в большинстве случае не избежать (по крайней мере без этого вся мощь fasm не достижима), но нужно чётко осознавать, что сначала отрабатывает однопроходный препроцессор (только fix здесь слегка особняком), а потом уже многопроходная стадия ассемблирования.
    Исходя из вышесказанного, теперь должно стать очевидным, что перечисленным именам присваивается не (!) последнее значение n, а сам символ "n".
    Когда же дело доходит до стадии ассемблирования, то отработавший препроцессор везде вместо соответствующего имени уже подставил этот символ. Теперь на стадии ассемблирования производится бессмысленное перечисление всех значений n от нуля до числа аргументов макроса, после чего n достигает стабильного значения (последнего) и ассемблируется в соответствующее число в исходнике.

    Один из вариантов workaround'а (если я правильно понял, что требуется):
    Код (Text):
    1. macro flags cell,[name]
    2. {
    3.     common
    4.         local cntr
    5.         cntr = 0
    6.     forward
    7.         val_#name = 1 shl cntr
    8.         val@#name = cntr
    9.         name equ [cell],val@#name
    10.         cntr = cntr + 1
    11. }
    Начиная с версии 1.69 автор также научил считать и препроцессор. Поэтому для более новых версий прокатит также и такой вариант:
    Код (Text):
    1. macro flags cell,[name]
    2. {
    3.     common
    4.         local cntr
    5.         cntr equ 0
    6.     forward
    7.         val_#name = 1 shl cntr
    8.         name equ [cell],cntr
    9.         rept 1 buf:cntr+1 \{ cntr equ buf \}
    10. }
     
  12. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    P.S. Хотя красоты ради в последнем примере лучше написать val_#name equ 1 shl cntr вместо val_#name = 1 shl cntr.
     
  13. gas

    gas New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2010
    Сообщения:
    52
    Код (Text):
    1. macro flags cell,[name]
    2. {
    3.     common
    4.         local cntr
    5.         cntr = 0
    6.     forward
    7.         val_#name = 1 shl cntr
    8.         val@#name = cntr
    9.         name equ [cell],val@#name
    10.         cntr = cntr + 1
    11. }
    Не работает. ФАСМ 1.57 . Но помойму я так же делал и на 1.67 - тоже не работало.
     
  14. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    gas
    А можно по-конкретнее? Что не работает? Если ошибка, то какая, в каком коде? А лучше вообще пример минимального исходника с воспроизводимой ошибкой (плюс текст ошибки).
    Народ явно обожает растягивать удовольствие ожидания ответа, выдавая информацию по крупицам.
     
  15. gas

    gas New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2010
    Сообщения:
    52
    Ой, звиняюсь, - работает! Я макросу ячейку в скобках написал.
    Спасибо.
     
  16. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    gas
    Часто стоит только попытаться правильно сформулировать вопрос, как неожиданно оказывается, что ответ находится в правильной постановке самого вопроса. :)
     
  17. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Немного ошибся с путями, вот:
    fasmw16912\TOOLS\WIN32\
     
  18. Z3N

    Z3N New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    812
    Можно и даже нужно. Пример:

    Код (Text):
    1. struct point
    2.          x    dd     ?
    3.          y    dd     ?
    4. ends
    5.  
    6. Внимание!
    7.  
    8. virtual at ebx
    9. StructAddressedAtEBX    point
    10. end virtual
    11.  
    12. mov [StructAddressedAtEBX.x],eax   ====>[ebx],eax
    13. mov [StructAddressedAtEBX.y],ecx   ====>[ebx+4],ecx
    И даже если бы этого не было, можно было бы делать так:
    Код (Text):
    1. struct point
    2.          x    dd     ?
    3.          y    dd     ?
    4. ends
    5.  
    6. mov [point.x+ebx],eax          ====>[ebx],eax
    7. mov [point.y+ebx],ecx          ====>[ebx+4],eax
    А также, можно было бы сделать что-то наподобие virtual с помощью макросов.
     
  19. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Z3N
    Типы есть сишные ?
    У меня например:
    Код (Text):
    1. QueryObject proc Object:HANDLE, Information:PSYSTEM_HANDLE_INFORMATION
    У вас будет чтото наподобие этого:
    Код (Text):
    1. QueryObject proc Object:DWORD, Information:DWORD
    Из этого не понять что за параметры.
     
  20. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Clerk
    Во-первых, ассемблер должен отображать возможности процессора. Процессор не поддерживает никаких HANDLE или PSYSTEM_HANDLE_INFORMATION. Процессор поддерживает DWORD. Смысл в десяти названиях для одного и того же?

    Во-вторых, если хотите, можете сколько угодно синонимов для DWORD наделать и будет поддерживать. Но опять таки, смысл? Истинный же тип (смысл) переменной должен быть виден из его названия. Иначе каждый раз нужно по всему исходнику искать, а какого же типа переменная была.