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

 WASM Phorum —› WASM.ASSEMBLER —› Необходимо оптимизировать

. 1 . 2 . 3 . >>

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


Дата: Сен 1, 2004 20:14:34 · Поправил: Asterix

Необходимо проверить значение flag и eax, в случае flag==1 && eax==0 обнулить flag
и сделать прыжок на метку. Задача оптимизировать по скорости и размеру,
использовать только один jcc

Возможные принимаемые значения
flag   | eax
(DWORD)|
--------------
  1    | != 0
--------------
  1    |  0
--------------
  0    | != 0
--------------
  0    |  0   


ЗЫ: честно говоря я уже запарился мудрить всяческие neg, sbb и т.д. %)


Дата: Сен 1, 2004 20:32:44

Возможные принимаемые значения

А сколько возможных действий исходя из флагов? 2? 4?


Дата: Сен 1, 2004 20:35:07 · Поправил: _Chingachguk_

lea ebx,[eax+1]
sub flag,ebx
jz @@Label
add flag,ebx

?

Кроме eax=-1...


Дата: Сен 1, 2004 20:40:34

_Chingachguk_
eax != 0 в двух случаях тебе о чём-нибудь говорит?

volodya
Не понял твой вопрос..


Дата: Сен 1, 2004 20:44:43

У тебя есть flag и eax. Каждый принимает по два значения. А сколько ты ДЕЙСТВИЙ выполняешь, после их проверки? Скажем, если eax != 0 и flag = 1, то идти налево, иначе, если flag = 0, то идти направо. Так вот, сколько у тебя таких "иди на ..." :) в программе?


Дата: Сен 1, 2004 20:46:02

Asterix

Кроме eax=-1 верно вроде...


Дата: Сен 1, 2004 20:48:53

volodya
Если я тебя правильно понял, то ответ содержится в условии задачи, если "flag==1 && eax==0 обнулить flag
и сделать прыжок на метку"
, т.е. идти налево, во всех остальных случаях идти прямо ни в коем случае не изменяя flag ;-)


Дата: Сен 1, 2004 21:14:25

Ну дык и? Если flag - eax == 1, то это и есть ответ задачи. Тебе _Chingachguk_ и написал.


Дата: Сен 1, 2004 21:46:51

volodya
Если flag==0 и eax==-1 что тогда?


Дата: Сен 1, 2004 22:04:02

Тогда, друг мой, ты должен приводить eax к модулю. Проверять число на знаковость. :)


Дата: Сен 1, 2004 23:20:20

Вот мой первый вариант:
  neg eax
  sbb eax,eax
  inc eax
  and eax,flag
  jnz @F


обнулять флаг в этом случае придётся после прыжка на метку.


Дата: Сен 1, 2004 23:23:21

А такой вариант:
dec flag      ;=0 только при flag = 1
or eax,flag   ;=0 только если eax=0 и flag был =1
jz label
inc flag
...


Дата: Сен 1, 2004 23:49:53

leo
Вроде работает но длиннее моего на 1 байт
00401000 >/$ FF0D 00304000       DEC DWORD PTR DS:[403000]
00401006  |. 0B05 00304000       OR EAX,DWORD PTR DS:[403000]
0040100C  |. 74 06               JE SHORT 00401014


00401014  |> F7D8                NEG EAX
00401016  |. 1BC0                SBB EAX,EAX
00401018  |. 40                  INC EAX
00401019  |. 2305 00304000       AND EAX,DWORD PTR DS:[403000]
0040101F  |. 75 02               JNZ SHORT 00401023


Дата: Сен 2, 2004 00:06:29

А если flag предварительно в регистр загрузить?


Дата: Сен 2, 2004 00:15:28

volodya
> А если flag предварительно в регистр загрузить?

Предложи свой код, сравним ;-)

. 1 . 2 . 3 . >>


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