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

 WASM Phorum —› WASM.PROJECTS —› FASM macro library

<< . 1 . 2 . 3 . 4 . 5 . >>

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


Дата: Авг 8, 2004 02:54:35 · Поправил: Asterix

S_T_A_S_
Вобщем это уже что-то, я попробовал написать такой макрос, по аналогии с твоим:
macro .IF arg1,condition,arg2
 {
  local  ..endif
  ..ENDIF..  equ  ..endif
   if condition eq '=='
      if arg1 in <eax,ebx,edx,ecx,esi,edi,ebp,esp> & arg2 eq 0
          test arg1,arg1
          jnz ..endif
      else
          cmp arg1,arg2
          jne ..endif
      end if
   else if condition eq '!='
      if arg1 in <eax,ebx,edx,ecx,esi,edi,ebp,esp> & arg2 eq 0
          test arg1,arg1
          jz ..endif
      else
          cmp arg1,arg2
          je ..endif
      end if
   end if
 }

macro   .ENDIF  { ..ENDIF..:restore     ..ENDIF.. }


Применять так
  .IF eax,'==',0FFh
      xor eax, eax
  .ENDIF

  .IF eax,'!=',0
      sub eax, eax
  .ENDIF

Будет генерится разный код, типа оптимизация ;-)


Дата: Авг 8, 2004 07:19:37 · Поправил: Asterix

Кстати, кажется в fasm есть какая-то директива для препроцессора, означающая
любой регистр, или мне это приснилось? тогда можно было бы сократить макрос.
а то в этом макросе ещё не все возможные регистры перечислены..


Дата: Авг 8, 2004 08:00:03 · Поправил: S_T_A_S_

Asterix

Во, получается! Я такое и имел вводу, мне и не нравится то, что нужно ещё и кавычки писать. :(

Ещё можно сделать окончание макроса таким, что бы проверялись ошибки:
      end if
   else ; добавлено
     'invalid condition' ; добавлено
   end if
 }



> „А почему твой макрос _IF, _ вместо . чтоб не конфликтовать с ранее тобой написанными или с Приваловскими?“

Да, а ещё потомучто он полурабочий :-)



Применять так:
.IF eax,'==',0
sub eax, eax
.ENDIF“


Хи-хи, это по-моему можно соптимизировать, просто удалить эти строки :-)


>„Кстати, кажется в fasm есть какая-то директива для препроцессора, означающая
любой регистр, или мне это приснилось?“


Вместо
if arg1 in <eax,ebx,edx,ecx,esi,edi,ebp,esp> & arg2 eq 0

Можно
if arg1 eqtype eax & arg2 eq 0


Дата: Авг 8, 2004 08:41:17 · Поправил: Asterix

S_T_A_S_
> Хи-хи, это по-моему можно соптимизировать, просто удалить эти строки :-)

Ну это я "от балды" писал :-)

> мне и не нравится то, что нужно ещё и кавычки писать. :(

Мне тоже не нравятся и запятые и кавычки, но лучше так чем никак, всёж-таки 1-а строчка вместо двух :-)
Проблему запятых и кавычек никак не решить без Привалова, вот только когда он захочет сделать какие-нибудь изменения для исправления этой ситуации неизвестно..

> Можно
if arg1 eqtype eax & arg2 eq 0


Точно!


Дата: Авг 8, 2004 08:53:30

Кстати вот чем хороши макросы, сегодня скачал fasmw 1.54 ну и решил опять же дописать код чтоб открывались последние открытые файлы на старте, и вот когда я его писал ещё для версии 1.53, то пришлось долго придумывать названия меткам, чтоб не повторялись с названиями меток Привалова, в итоге получились длиннющие названия, с макросами эта проблема, во многих случаях, отпадает.


Дата: Авг 8, 2004 10:33:24 · Поправил: Asterix

S_T_A_S_
> Ещё можно сделать окончание макроса таким, что бы проверялись ошибки

Ещё можно(нужно?) так+ещё добавить проверок:
macro .IF arg1,condition,arg2
 {
  local  ..endif
  ..ENDIF..  equ  ..endif
  if arg1 eqtype eax | arg1 eqtype [0]
   if condition eq '=='
      if arg1 eqtype eax & arg2 eq 0
          test arg1,arg1
          jnz ..endif
      else
          cmp arg1,arg2
          jne ..endif
      end if
   else if condition eq '!='
      if arg1 eqtype eax & arg2 eq 0
          test arg1,arg1
          jz ..endif
      else
          cmp arg1,arg2
          je ..endif
      end if
   else
     'invalid condition'
   end if
  else
    'invalid condition'
  end if
 }


Дата: Авг 8, 2004 13:23:30

Немного доработал макросы, теперь скорость компиляции несколько выше ;-)


Asterix > „А сюда войдут 16 и 8 битные регистры? “

Да, eqtype eax указывает на то, что тип операнда любой регистр

_1577591440__fasm.zip


Дата: Авг 8, 2004 22:05:39

> Да, eqtype eax указывает на то, что тип операнда любой регистр

Угу, уже разобрался, поэтому и удалил свой вопрос про 16 и 8 бит ;-)


Дата: Авг 9, 2004 04:36:03

S_T_A_S_
Можно ли обработать ситуацию
.IF !eax
....
.ENDIF
без разделения !eax запятой(!,eax) или написания другого макроса .IF! т.е. нужно как-то отделить то что после ! проверить его тип и подставить в команду cmp/test

ЗЫ: почему ты теперь стал заменять в макросах .. на __ ?


Дата: Авг 9, 2004 07:18:07

Можно попробовать так:

!eax fix eax,'!'

тогда

.IF !eax

будет преобразовано к

.IF eax,'!'

Макрос .IF нужно будет переделать, что бы он анализировал 2й аргумент ('!')


> „почему ты теперь стал заменять в макросах .. на __ ?“

Да просто точки не выделяются по 2му клику :-)


Дата: Авг 9, 2004 07:58:17

S_T_A_S_
!eax fix eax,'!'
тогда
.IF !eax
будет преобразовано


Вместо eax может быть любой другой регистр или переменная, тогда как, тоже можно? %)
Придётся наверно делать так
.IF !,eax
если будет конфликтовать то ещё и брать в скобочки '!',eax
жуть :-)
Надо бы донести до Privalov'a чтоб он сделал возможным в качестве разделителя использовать пробелы и табуляцию, хотя бы пробелы, и чтоб добавил возможность перед анализом переменной отбрасывать у нее первый строчный символ, в данном случае !
вот тогда макросы сильно преобразятся в лучшую сторону :-) но у меня с английским плохо, может ты попробуешь написать там на форуме?


Дата: Авг 9, 2004 10:49:40

Asterix > „Вместо eax может быть любой другой регистр или переменная, тогда как, тоже можно? %) “

Нет, для переменных нельзя (не только потому что их слишком много, и для каждой нужно делать FIX, а потому что это может быть [eax*8+ebx])


> „Надо бы донести до Privalov'a чтоб он сделал возможным в качестве разделителя использовать пробелы и табуляцию, хотя бы пробелы,“

afaik, он когда-то давно планировал реализовать это в версии 2.0, так что нужно немного подождать :-)


> „возможность перед анализом переменной отбрасывать у нее первый строчный символ, в данном случае !“

Это наверное слишком сложно без значительных изменений в архитектуре FASM'а.
Предыдущее возможно несколько проще, но может сказаться на производительности..


Вообще, где могут всякие переменные-то понядобиться, всё не пойму? Это же не Си.
Максимум, что я использую - сравнение ячейки память с нулём, а если нужно сравнивать с каким-то другим числом, то где-то поблизости её значение обычно используется, всё одно его нужно в регистр толкать, так и размер кода меньше получится и скорость лучше.


Кстати, FASM имеет возможность писАть несколько команд в одной строке, так что может быть проще сделать это небольшое изменение. (хотя официально оно не будет реализовано).


Дата: Авг 9, 2004 11:15:40

> Это наверное слишком сложно без значительных изменений в архитектуре FASM'а.

А вот masm имеет такую возможность, можно обработать любой символ строки, взять только нужное и использовать по назначению.
Я практически реализовал всё что хотел, кроме отрицания !(регистр или переменная), хотя честно говоря я в masm ни разу не пользовался синтаксисом вида .IF eax или .IF !eax , для наглядности люблю явное указание с чем сравнивать.
А вот такое сравнение fasm'у пока и не снилось
.IF (al>="0" && al<="9") || (al>="A" && al<="F") || (al>="a" && al<="f")


Дата: Авг 9, 2004 11:32:23

Asterix
„А вот masm имеет такую возможность, можно обработать любой символ строки, взять только нужное и использовать по назначению.“
Для этого фасму надо заиметь возможность возвращать значения из макросов, что его препроцессор делать не может и без существенных изменений не сможет :(

А вообще мне понравилась дискуссия. Надо будет и свои 5 копеек вставить;)


Дата: Авг 9, 2004 12:09:31 · Поправил: Uri

А вот и 5 копеек:

S_T_A_S_
„Кстати, FASM имеет возможность писАть несколько команд в одной строке“

В файле ASSEMBLE.INC надо найти метку instruction_assembled: (а не instruction_assembler:, как в оригинале,
345-я строка. На 5 строк ниже (350-я) есть команда jnz extra_characters_on_line.
Ее надо поменять на jnz assemble_line.

После этого перекомпилить фасм.

Станет доступной возможность писать такой код:
    cmp eax,123    jne @f
        mov eax,223
        mov ebx,334
@@: nop

Однако будьте готовы к непредвиденным глюкам :)

Кстати, не забутьте одновременно изменить версию фасма в файле VERSION.INC, что бы потом не путаться, где оригинальный, а где патченый.

<< . 1 . 2 . 3 . 4 . 5 . >>


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