Необходимо оптимизировать

Тема в разделе "WASM.ASSEMBLER", создана пользователем Asterix, 1 сен 2004.

  1. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Необходимо проверить значение flag и eax, в случае flag==1 && eax==0 обнулить flag

    и сделать прыжок на метку. Задача оптимизировать по скорости и размеру,

    использовать только один jcc



    Возможные принимаемые значения
    Код (Text):
    1. flag   | eax
    2. (DWORD)|
    3. --------------
    4.   1    | != 0
    5. --------------
    6.   1    |  0
    7. --------------
    8.   0    | != 0
    9. --------------
    10.   0    |  0  




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

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Возможные принимаемые значения



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

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    lea ebx,[eax+1]

    sub flag,ebx

    jz @@Label

    add flag,ebx



    ?



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

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    _Chingachguk_

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



    volodya

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

    volodya wasm.ru

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

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Asterix



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

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    volodya

    Если я тебя правильно понял, то ответ содержится в условии задачи, если "flag==1 && eax==0 обнулить flag

    и сделать прыжок на метку"
    , т.е. идти налево, во всех остальных случаях идти прямо ни в коем случае не изменяя flag :derisive:
     
  8. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Ну дык и? Если flag - eax == 1, то это и есть ответ задачи. Тебе _Chingachguk_ и написал.
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    volodya

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

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Тогда, друг мой, ты должен приводить eax к модулю. Проверять число на знаковость. :)
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Вот мой первый вариант:
    Код (Text):
    1.   neg eax
    2.   sbb eax,eax
    3.   inc eax
    4.   and eax,flag
    5.   jnz @F




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

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    А такой вариант:
    Код (Text):
    1.  
    2. dec flag      ;=0 только при flag = 1
    3. or eax,flag   ;=0 только если eax=0 и flag был =1
    4. jz label
    5. inc flag
    6. ...
     
  13. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    leo

    Вроде работает но длиннее моего на 1 байт
    Код (Text):
    1. 00401000 >/$ FF0D 00304000       DEC DWORD PTR DS:[403000]
    2. 00401006  |. 0B05 00304000       OR EAX,DWORD PTR DS:[403000]
    3. 0040100C  |. 74 06               JE SHORT 00401014
    4.  
    5.  
    6. 00401014  |> F7D8                NEG EAX
    7. 00401016  |. 1BC0                SBB EAX,EAX
    8. 00401018  |. 40                  INC EAX
    9. 00401019  |. 2305 00304000       AND EAX,DWORD PTR DS:[403000]
    10. 0040101F  |. 75 02               JNZ SHORT 00401023
     
  14. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    А если flag предварительно в регистр загрузить?
     
  15. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    volodya

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



    Предложи свой код, сравним :derisive:
     
  16. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Тю, возьми код leo и сделай так:


    Код (Text):
    1. mov ebx, flag
    2. dec ebx      ;=0 только при flag = 1
    3. or eax,ebx   ;=0 только если eax=0 и flag был =1
    4. jz label
     
  17. boozook

    boozook New Member

    Публикаций:
    0
    Регистрация:
    3 апр 2003
    Сообщения:
    18
    Адрес:
    Russia
    может так сработает:
    Код (Text):
    1.  
    2. xor eax,1
    3. xor eax,flag
    4. jz label
    5.  
     
  18. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    volodya

    Ok, убедил, так код короче будет =)
     
  19. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    boozook

    Не сработает.
     
  20. boozook

    boozook New Member

    Публикаций:
    0
    Регистрация:
    3 апр 2003
    Сообщения:
    18
    Адрес:
    Russia
    Asterix

    тогда почему
    Код (Text):
    1.  
    2. xor eax,1    ; 1 будет только если eax=0
    3. xor eax,flag ; 0 будет только если flag=1 и eax был 0
    4. jz label
    5.  




    а вообще лучше так:
    Код (Text):
    1.  
    2. sub eax,flag
    3. jc label
    4.