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

Discussion in 'WASM.BEGINNERS' started by vertox, Nov 3, 2010.

  1. vertox

    vertox New Member

    Blog Posts:
    0
    Joined:
    Feb 26, 2009
    Messages:
    15
    Если в регистре больше 0400 то регистр равен 0400, если больше 0200 то 0200.
    Одним оператором без CMP нельзя ?
     
  2. shoo

    shoo New Member

    Blog Posts:
    0
    Joined:
    Jul 17, 2003
    Messages:
    1,537
    Location:
    Ukraine
    без СМР можно, одним оператором нельзя
     
  3. vertox

    vertox New Member

    Blog Posts:
    0
    Joined:
    Feb 26, 2009
    Messages:
    15
    а какой самый оптимальный по размеру код ?
     
  4. MSoft

    MSoft New Member

    Blog Posts:
    0
    Joined:
    Dec 16, 2006
    Messages:
    2,854
    cmp eax,400
    jbe @F
    mov eax,400
    @@:
    cmp eax,200
    jbe @F
    mov eax,200
    @@:
     
  5. vertox

    vertox New Member

    Blog Posts:
    0
    Joined:
    Feb 26, 2009
    Messages:
    15
    MSoft
    Спасибо.
     
  6. shoo

    shoo New Member

    Blog Posts:
    0
    Joined:
    Jul 17, 2003
    Messages:
    1,537
    Location:
    Ukraine
    только учти, этот код делает все так как ты заказал: сначала сравнивает с 400, потом с 200, т.е. если в его середине ничего нет, то сравнение фактически выполняется только с 200 ;)
     
  7. vertox

    vertox New Member

    Blog Posts:
    0
    Joined:
    Feb 26, 2009
    Messages:
    15
    shoo
    Мне надо если больше 400 то 400
     
  8. CrystalIC

    CrystalIC New Member

    Blog Posts:
    0
    Joined:
    Jul 26, 2008
    Messages:
    500
    Разделить, округлить до целого и умножить. Если средствами cpu, то он сам округлит.
     
  9. baldr

    baldr New Member

    Blog Posts:
    0
    Joined:
    Apr 29, 2010
    Messages:
    327
    vertox,

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

    edemko New Member

    Blog Posts:
    0
    Joined:
    Nov 25, 2009
    Messages:
    454
    MSoft,
    с разрушением другого регистра, можно улучшить:
    Code (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

    Blog Posts:
    0
    Joined:
    Nov 25, 2009
    Messages:
    454
    ред второй раз: я торможу, простите
     
  12. persicum

    persicum New Member

    Blog Posts:
    0
    Joined:
    Feb 2, 2007
    Messages:
    947
    Чего то на ум масочки приходят... Этож задачка на маски типа сначала and eax,600.. Ну и так далее, какой CMP ???
     
  13. edemko

    edemko New Member

    Blog Posts:
    0
    Joined:
    Nov 25, 2009
    Messages:
    454
    persicum,
    будет мног масок наверно
     
  14. baldr

    baldr New Member

    Blog Posts:
    0
    Joined:
    Apr 29, 2010
    Messages:
    327
    Естественно, ведь 400 от 200 отличается в массе мест (бита четыре, минима :derisive:.

    vertox,

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

    Miyamoto New Member

    Blog Posts:
    0
    Joined:
    Oct 23, 2010
    Messages:
    46
    А если CMOV заюзать?

    Code (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

    Blog Posts:
    0
    Joined:
    Oct 23, 2010
    Messages:
    46
    edemko

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

    edemko New Member

    Blog Posts:
    0
    Joined:
    Nov 25, 2009
    Messages:
    454
    Miyamoto,
    наши посты неверны: результат всегда будет 0..200
     
  18. Miyamoto

    Miyamoto New Member

    Blog Posts:
    0
    Joined:
    Oct 23, 2010
    Messages:
    46
    edemko
    Хм, протестил сейчас свой вариант -- и точно, корректно работает только при значении в 200 < AX < 400.
    То есть, если допустим в АХ 355, то устанавливается 200. И если в АХ 555, то тоже устанавливается 200.
    Надо попробовать вначале сравнивать с 400, потом с 200.

    Code (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

    Blog Posts:
    0
    Joined:
    Oct 23, 2010
    Messages:
    46
    В общем если только еще один регистр рушить, тогда можно, а иначе никак (без переходов) не сделать.

    Code (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

    Blog Posts:
    0
    Joined:
    Dec 16, 2006
    Messages:
    2,854
    эм... ребят, в чем сложность??? вы последовательно выбираете меньшее число, сравнивая сначала с 400, потом с 200. Конечно у вас в итоге всегда максимальное число будет 200. Вы или разбейте код на две отдельные задачи, или сформулируйте точно условие выбора чисел. Нашли блин проблему