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

 WASM Phorum —› WASM.ASSEMBLER —› Можно ли соптимизировать (туплю конкретно :(

. 1 . 2 . 3 . 4 . >>

Посл.отвђт Сообщен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"? Так это ж нефик делать тогда :))

. 1 . 2 . 3 . 4 . >>


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