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