Уменьшение значения регистра

Тема в разделе "WASM.BEGINNERS", создана пользователем vertox, 3 ноя 2010.

  1. vertox

    vertox New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2009
    Сообщения:
    15
    Если в регистре больше 0400 то регистр равен 0400, если больше 0200 то 0200.
    Одним оператором без CMP нельзя ?
     
  2. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    без СМР можно, одним оператором нельзя
     
  3. vertox

    vertox New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2009
    Сообщения:
    15
    а какой самый оптимальный по размеру код ?
     
  4. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    cmp eax,400
    jbe @F
    mov eax,400
    @@:
    cmp eax,200
    jbe @F
    mov eax,200
    @@:
     
  5. vertox

    vertox New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2009
    Сообщения:
    15
    MSoft
    Спасибо.
     
  6. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    только учти, этот код делает все так как ты заказал: сначала сравнивает с 400, потом с 200, т.е. если в его середине ничего нет, то сравнение фактически выполняется только с 200 ;)
     
  7. vertox

    vertox New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2009
    Сообщения:
    15
    shoo
    Мне надо если больше 400 то 400
     
  8. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Разделить, округлить до целого и умножить. Если средствами cpu, то он сам округлит.
     
  9. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    vertox,

    Регистр, больший 400, больше 200 (это вытекает из 400>200 и транзитивности отношения порядка >). Чего, всё-таки, хотелось?
     
  10. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    MSoft,
    с разрушением другого регистра, можно улучшить:
    Код (Text):
    1. CPU Disasm
    2. Address                      Hex dump          Command                                       Comments
    3. <ModuleEntryPoint> 0040135A  /.  3D 90010000   cmp     eax,190
    4. 0040135F                     |.  76 05         jbe     short test.00401366
    5. 00401361                     |.  B8 90010000   mov     eax,190
    6. 00401366                     |>  3D C8000000   cmp     eax,0C8
    7. 0040136B                     |.  76 05         jbe     short test.00401372
    8. 0040136D                     |.  B8 C8000000   mov     eax,0C8
    9.  
    10. 00401372                     \>  C3            retn
    11.  
    12. 00401373                         BA C8000000   mov     edx,0C8
    13. 00401378                         39D0          cmp     eax,edx
    14. 0040137A                         0F47C2        cmova   eax,edx
    15. 0040137D                         01D2          add     edx,edx
    16. 0040137F                         39D0          cmp     eax,edx
    17. 00401381                         0F47C2        cmova   eax,edx
    CrystalIC,
    ?
     
  11. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    ред второй раз: я торможу, простите
     
  12. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Чего то на ум масочки приходят... Этож задачка на маски типа сначала and eax,600.. Ну и так далее, какой CMP ???
     
  13. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    persicum,
    будет мног масок наверно
     
  14. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Естественно, ведь 400 от 200 отличается в массе мест (бита четыре, минима :derisive:.

    vertox,

    Скажи уже что хотел ограничить значение регистра снизу двумястами, а сверху четырямистами, и всё. :derisive:
     
  15. Miyamoto

    Miyamoto New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2010
    Сообщения:
    46
    А если CMOV заюзать?

    Код (Text):
    1. .686
    2. mov   BX,200
    3. cmp   AX,BX
    4. cmova AX,BX
    5. shl     BX,1
    6. cmp   AX,BX
    7. cmova AX,BX
    Как быстрее будет? С джампами или с условной пересылкой?
    А вообще, задача бред.
     
  16. Miyamoto

    Miyamoto New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2010
    Сообщения:
    46
    edemko

    Пардон, ваш код не усмотрел. Почти то же самое написал. :)
     
  17. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Miyamoto,
    наши посты неверны: результат всегда будет 0..200
     
  18. Miyamoto

    Miyamoto New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2010
    Сообщения:
    46
    edemko
    Хм, протестил сейчас свой вариант -- и точно, корректно работает только при значении в 200 < AX < 400.
    То есть, если допустим в АХ 355, то устанавливается 200. И если в АХ 555, то тоже устанавливается 200.
    Надо попробовать вначале сравнивать с 400, потом с 200.

    Код (Text):
    1. .686
    2. mov   BX,400
    3. cmp   AX,BX
    4. cmova AX,BX
    5. shr    BX,1
    6. cmp   AX,BX
    7. cmova AX,BX
    ps Так тоже не пашет, разумеется :dntknw:
    Будем думать.
     
  19. Miyamoto

    Miyamoto New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2010
    Сообщения:
    46
    В общем если только еще один регистр рушить, тогда можно, а иначе никак (без переходов) не сделать.

    Код (Text):
    1. mov    ax,5555 ; введенное значение
    2. mov    bx,ax   ; дублируем его
    3. mov    dx,200
    4.  
    5. cmp    bx,dx
    6. cmova  ax,dx
    7.  
    8. shl    dx,1
    9.  
    10. cmp    bx,dx
    11. cmova  ax,dx
     
  20. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    эм... ребят, в чем сложность??? вы последовательно выбираете меньшее число, сравнивая сначала с 400, потом с 200. Конечно у вас в итоге всегда максимальное число будет 200. Вы или разбейте код на две отдельные задачи, или сформулируйте точно условие выбора чисел. Нашли блин проблему