Мелкие задачки для крупных мозгов №16

Тема в разделе "WASM.A&O", создана пользователем The Svin, 1 май 2006.

  1. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Задача в зависимости от значения числа в eax поместить в cl "+" "-" или " "

    + если eax - положительное

    - если отрицательное

    пробел если 0. Безбранчевый код с оптимизацией по размеру.

    eax портить нельзя. Свободный только один регистр (пусть edx)

    Пока такой незатейлевый код:
    Код (Text):
    1.  
    2.     mov cl,2Bh ;"+"
    3.     cdq        ;edx = 1...1 if eax < 0 0..0 if eax >=0
    4.     and dl,2    ;dl=2 if eax < 0, 0 if eax >= 0
    5.     add cl,dl   ;cl=2B+2=2D("-") if eax < 0,=3B+0=3B("+") if eax >=0
    6.     cmp eax,1   ;CF if eax = 0
    7.     sbb edx,edx ;edx=1..1 if eax = 0,=0..0 if eax <> 0
    8.     and edx,2Bh-20h ;edx=0B if eax = 0,=0 if eax <> 0
    9.     sub cl,dl   ;cl=2B-0B=20h(" ") if eax = 0, =cl-0 if eax <> 0
    10.  
    11.  
     
  2. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Может знак лучше оставить в dl?
    Код (Text):
    1.     test eax,eax
    2.     pushf
    3.     pop ecx
    4.     shr cl,3
    5.     mov edx,$2D202B
    6.     shr edx,cl
    7.     mov cl,dl
     
  3. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    у меня тоже похожее созрело, 6 команд на 16 байт
    Код (Text):
    1. mov     ecx,0x2d2b2002 ;('-' shl 24) or ('+' shl 16) or (' ' shl 8) or 2
    2. cdq
    3. cmp     eax,1
    4. sbb     cl,dl
    5. shl     cl,3
    6. shr     ecx,cl
     
  4. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Black_mirror

    Идея интересная, если бы не AF. По докам он undefind после shr x,не ноль.

    На практике проверил - выставил AF, сдвинул shr edx,3 - AF не сбросился (PIII). Значит он окажется в cl, если не сбросится с помощью test, конечно. По докам опять же - после test AF undefind. На практике проверил - после test он сбросился. Однако можно ли быть уверенным о других камнях? Если принудительно сбросить, получится длинее в байтах чем первый вариант.
     
  5. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    bogrus

    Красиво, все идейки увязались в одно :)
     
  6. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Раз c AF забраковали, тогда 5 команд, 14 байт:
    Код (Text):
    1.     cdq
    2.     cmp edx,eax    
    3.     adc edx,edx
    4.     lea ecx,[edx*8+$2D2B2008]
    5.     shr ecx,cl
     
  7. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    идеально, можно ставить бутылку, что меньше не получится :)
     
  8. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Код (Text):
    1.  
    2. cdq     ;-1,0
    3. cmp edx,eax     ;eax=0 CF=0,eax<0 CF=0 ,eax > 0 CF=1
    4. adc edx,edx ;eax=0 edx=0, eax < 0 edx=-2, eax > 0 edx=1
    5. lea ecx,[edx*8+$2D2B2008] ;eax=0 cl=8+0=8, eax < 0 8+-16= -8 =11000 = 24;eax>0 cl=8+8=16
    6. shr ecx,cl
    7.  


    Всё верно. Блестяще.

    Пора мне на пенсию :)