|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Июн 11, 2004 03:29:03 Можно ли соптимизировать, что-то я сегодня плохо соображаю, но вижу что два раза проверять одно и то же условие нехорошо: ; изначально все переменные Flag обнулены
.IF (temp1=='1')||(temp2=='1')
.IF temp1=='1'
inc Flag1
.ENDIF
.IF temp2=='1'
inc Flag2
.ENDIF
inc Flag3
.ENDIF |
|
|
Дата: Июн 11, 2004 04:54:31 q_q Ой, я сейчас на изрядно "несвежую" голову(ночь однако ;-) и не въеду то ли мне надо, но в данном случае сильная оптимизация не нужна, я лишь хотел избавиться от лишних двух jcc в моём коде.. |
|
|
Дата: Июн 11, 2004 07:29:51 Я имел ввиду приблизительно такой код, но опять же мне не очень нравится манипуляция с Flag3 хотя видимо от двойного присваивания тут не уйти cmp temp1,'1' jne @F inc Flag1 inc Flag3 @@: cmp temp2,'1' jne @F inc Flag2 mov Flag3,1 @@: |
|
|
Дата: Июн 11, 2004 14:31:59 Если у тебя флаги типа Byte (а это логично, тогда): cmp temp1,'1' setz Flag1 setz Flag3 shr Flag3, 1 ; ZF -> CF cmp temp2,'1' setz Flag2 setbe Flag3 ; (CF=1 или ZF=1) |
|
|
Дата: Июн 11, 2004 16:21:41 какой диапазон значений temp1, temp2? |
|
|
Дата: Июн 11, 2004 18:31:49 q_q Зря убрал, я вот только сегодня хотел рассмотреть подробней твой вариант. masquer tempX должно быть типа BYTE PTR [esi+X] coban2k > Если у тебя флаги типа Byte (а это логично, тогда) Не угадал, я не "логичный", флаги типа DWORD =) |
|
|
Дата: Июн 11, 2004 19:10:53 .IF (temp1=='1')||(temp2=='1') .IF temp1=='1' inc Flag1 .ENDIF .IF temp2=='1' inc Flag2 .ENDIF inc Flag3 .ENDIF Я на это долго смотрел... Смотрел-смотрел и думаю, а какого икса ты так поступаешь? if(temp1=='1') Flag1++; else if(temp2=='1') Flag2++; else Flag3++; Логика-то та же! Ведь у тебя || - OR стоит, а значит, в данной развязке его можно просто выкинуть 8-/ |
|
|
Дата: Июн 11, 2004 19:16:02 volodya Так низзя. Оба условия должны быть проверены подряд и выставлены флаги, и если хоть одно из двух условий верно то должен быть выставлен флаг3. |
|
|
Дата: Июн 11, 2004 19:18:33 Asterix я не это имел ввиду. Просто если диапазон будет 30h-39h будет одна оптимизация, иначе другая... В общем случае вообще без переходов вполне можно сделать. volodya имхо, твой алгоритм несколько не соответствует начальному условию :) 3-й флаг инкрементируется в случае, если хотя бы одно из темп-значений равно "1" |
|
|
Дата: Июн 11, 2004 19:18:59 Сорри у меня в предудыщем посте была ошибка, этот теперь работает для FlagX типа DWORD, также тут нет ни одного jmp ;) xor eax, eax cmp temp1,'1' setz al mov Flag1, eax mov Flag3, eax cmp temp2,'1' setz al mov Flag2, eax or Flag3, eax |
|
|
Дата: Июн 11, 2004 19:20:23 Тогда вопрос. А если я перепишу так:
.IF temp1=='1'
inc Flag1
.ENDIF
.IF temp2=='1'
inc Flag2
.ENDIF
.IF (temp1=='1')||(temp2=='1')
inc Flag3
.ENDIF
Просто для любопытства - это изменит твой смысл? |
|
|
Дата: Июн 11, 2004 19:25:26 > Просто для любопытства - это изменит твой смысл? Не изменит. |
|
|
Дата: Июн 11, 2004 19:28:41 · Поправил: Quantum volodya if(temp1=='1'){ Flag1++; Flag3++; }
if(temp2=='1'){ Flag2++; Flag3 = 1; } |
|
|
Дата: Июн 11, 2004 19:29:32 masquer Обрабатывается только '1', все остальные возможные значения(любые ASCII символы) считаются равными '0' |
|
|
Дата: Июн 11, 2004 19:33:13 Asterix Т.е. возможны только "1" и "0"? Так это ж нефик делать тогда :)) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.050 |