Задачка об уникальных тетрадах

Тема в разделе "WASM.A&O", создана пользователем Black_mirror, 11 мар 2010.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    и еще чуть-чуть
    Код (Text):
    1.     mov eax,0ABCDEF0h
    2.     mov esi,0Fh
    3.     xor ebp,ebp
    4.     xor ecx,ecx
    5.     mov ebx,eax
    6.     rept 7
    7.     ror ebx,4
    8.     mov edx,ebx
    9.     xor edx,eax
    10.     rept 8
    11.     test edx,esi
    12.     setz cl
    13.     ror esi,4
    14.     or ebp,ecx
    15.     endm
    16.     endm
    17.     dec ebp
    18.     xchg eax,ebp
     
  2. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Booster
    >Не катит, в условии чётко сказано - "Без переходов".

    Чепуха, досрочный выход из тела (онейронавты, молчать!) за ветвления не считается.
     
  3. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    persicum
    Если у вас есть циклы, то сравнивать ваш код в другой категории будем.
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Black_mirror
    rept легко поменять на вложенные циклы
     
  5. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Black_mirror
    Циклов нет, а JMP для досрочного выхода это даже хорошо =)))

    Пишу из головы, поэтому для реального применения может потребоваться отладка и доводка… Кста, стек увеличивается или уменьшается когда в него кладут? Будем считать для определенности, что уменьшается…

    mov ecx,eax
    xor eax,eax //код возврата

    mov ebp,esp
    sub esp,16

    mov [ebp],02020202h
    mov [ebp-4],02020202h
    mov [ebp-8],02020202h
    mov [ebp-12],02020202h

    mov edx,ecx
    and edx,15
    dec byte[ebp-edx]

    shr ecx,4
    mov edx,ecx
    and edx,15
    dec byte[ebp-edx]
    jz @quit

    shr ecx,4
    mov edx,ecx
    and edx,15
    dec byte[ebp-edx]
    jz @quit

    shr ecx,4
    mov edx,ecx
    and edx,15
    dec byte[ebp-edx]
    jz @quit

    shr ecx,4
    mov edx,ecx
    and edx,15
    dec byte[ebp-edx]
    jz @quit

    shr ecx,4
    mov edx,ecx
    and edx,15
    dec byte[ebp-edx]
    jz @quit

    shr ecx,4
    mov edx,ecx
    and edx,15
    dec byte[ebp-edx]
    jz @quit

    shr ecx,4
    mov edx,ecx
    and edx,15
    dec byte[ebp-edx]
    jz @quit

    dec eax // теперь код возврата -1

    :@quit
    add esp,16
     
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    если взять за основу идею persicum
    Код (Text):
    1.     mov eax,0ABCDEF0h
    2.     xor ebp,ebp
    3.     xor edx,edx
    4.     rept 8
    5.     mov ebx,eax
    6.     and ebx,0Fh
    7.     add tabl[ebx],1
    8.     shr eax,4
    9.     endm
    10.     mov esi,offset tabl
    11.     rept 16
    12.     lodsb
    13.     test al,0FEh
    14.     setnz dl
    15.     or ebp,edx
    16.     endm
    17.     dec ebp
    18.     xchg eax,ebp
    19. .data
    20. tabl   db 16 dup (0)
     
  7. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    похож наврал, лучше
    mov [ebp-3],02020202h
    mov [ebp-7],02020202h
    mov [ebp-11],02020202h
    mov [ebp-15],02020202h
     
  8. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    KeSqueer
    Не знал что в aam можно задавать делитель. Круто!
     
  9. persicum

    persicum New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2007
    Сообщения:
    947
    Да, и в начеле еще наверное нужно
    dec ebp

    Блин, честные юзары в стек только пушают и попают, это только зловреды умеют в нем ковыряться...
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    так короче
    Код (Text):
    1.     mov eax,0ABCDEF0h
    2.     xor ebp,ebp
    3.     xor edx,edx
    4.     rept 8
    5.     mov ebx,eax
    6.     and ebx,0Fh
    7.     add tabl[ebx],1
    8.     shr eax,4
    9.     endm
    10.     mov esi,offset tabl
    11.     push esi
    12.     mov edi,esi
    13.     rept 16
    14.     lodsb
    15.     shr al,1; оставляю числа больше 1
    16.     stosb
    17.     endm
    18.     pop esi
    19.     rept 4
    20.     lodsd
    21.     test eax,eax
    22.     setnz dl
    23.     or ebp,edx
    24.     endm
    25.     dec ebp
    26.     xchg eax,ebp
    27. .data
    28. tabl   db 16 dup (0)
     
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    а так еще короче
    Код (Text):
    1.     mov eax,1ABCDEF0h
    2.     xor ebp,ebp
    3.     xor edx,edx
    4.     rept 8
    5.     mov ebx,eax
    6.     and ebx,0Fh
    7.     add tabl[ebx],1
    8.     shr eax,4
    9.     endm
    10.     mov esi,offset tabl
    11.     rept 4
    12.     lodsd
    13.     and eax,0FEFEFEFEh
    14.     test eax,eax
    15.     setnz dl
    16.     or ebp,edx
    17.     endm
    18.     dec ebp
    19.     xchg eax,ebp
    20. .data
    21. tabl   db 16 dup (0)
     
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    murder
    [offtop]Команду AAD обычно используют для подготовки двух неупакован­ных BCD-цифр (в регистре AH находится число десятков, в регистре AL – число единиц) для операции деления, которая вернет результат в неупако­ванном виде. Это выполняется уста­новкой регистра AL равным AL+(10*AH) и сбросом AH в 0. После этого в регистре AX находится двоичный эквивалент исходного неупако­ванного числа из двух цифр. Код команды AAD равен 0D50Ah, попробуй­те вста­вить в вашу программу команду DB 0D5h,20h и вы обнаружите, что после такого кода содержимое регистра AL станет равным AL+(32*AH). Недо­статок такого умножения – результат не может быть больше 255, так как содержимое регистра AH будет обнуляться. Команду AAD можно использовать если необходимо разделить содержимое регистра AH на 10.
    Команда AAM осуще­ствляет деление содержимого регистра AL на 10 и загружает частное в регистр AH, а остаток – в регистр AL. Код команды AAM равен 0D40Ah, попробуйте вставить в вашу программу команду db 0D4h,07 и вы обнаружите, что после такого кода содержимое регистра AL будет поделено на 7, в регистр AH загружено частное, а оста­ток – в регистре AL. Недостаток такого деления – дели­мое не может быть больше 255, так как содержимое регистра AH будет иг­норироваться.
    Статья st0ne [HUGI] с сайта asm.shadrinsk.net: "Скрытая мощь BCD-инструкций"[/offtop]
     
  13. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Вариант с циклом, 21 байт:
    Код (Text):
    1. 00402000  /$ 31D2           XOR EDX,EDX
    2. 00402002  |. B1 01          MOV CL,1
    3. 00402004  |> C1C0 04        /ROL EAX,4
    4. 00402007  |. 66:0FABC2      |BTS DX,AX
    5. 0040200B  |. 10C9           |ADC CL,CL
    6. 0040200D  |.^73 F5          \JNB SHORT q.00402004
    7. 0040200F  |. F6D9           NEG CL
    8. 00402011  |. 19C0           SBB EAX,EAX
    9. 00402013  |. F7D0           NOT EAX
    10. 00402015
    Вариант без цикла, 69 байт:
    Код (Text):
    1. 00402000  /$ 31D2           XOR EDX,EDX
    2. 00402002  |. 0FABC2         BTS EDX,EAX
    3. 00402005  |. B1 04          MOV CL,4
    4. 00402007  |. D3C0           ROL EAX,CL
    5. 00402009  |. 0FABC2         BTS EDX,EAX
    6. 0040200C  |. 19DB           SBB EBX,EBX
    7. 0040200E  |. D3C0           ROL EAX,CL
    8. 00402010  |. 0FABC2         BTS EDX,EAX
    9. 00402013  |. 11DB           ADC EBX,EBX
    10. 00402015  |. D3C0           ROL EAX,CL
    11. 00402017  |. 0FABC2         BTS EDX,EAX
    12. 0040201A  |. 11DB           ADC EBX,EBX
    13. 0040201C  |. D3C0           ROL EAX,CL
    14. 0040201E  |. 0FABC2         BTS EDX,EAX
    15. 00402021  |. 11DB           ADC EBX,EBX
    16. 00402023  |. D3C0           ROL EAX,CL
    17. 00402025  |. 0FABC2         BTS EDX,EAX
    18. 00402028  |. 11DB           ADC EBX,EBX
    19. 0040202A  |. D3C0           ROL EAX,CL
    20. 0040202C  |. 0FABC2         BTS EDX,EAX
    21. 0040202F  |. 11DB           ADC EBX,EBX
    22. 00402031  |. D3C0           ROL EAX,CL
    23. 00402033  |. 0FABC2         BTS EDX,EAX
    24. 00402036  |. 11DB           ADC EBX,EBX
    25. 00402038  |. 0FA4D3 10      SHLD EBX,EDX,10
    26. 0040203C  |. 66:21D3        AND BX,DX
    27. 0040203F  |. F7DB           NEG EBX
    28. 00402041  |. 19C0           SBB EAX,EAX
    29. 00402043  |. F7D0           NOT EAX
    30. 00402045
     
  14. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    69 байт с циклом. Ничего особенного, но важен процесс, а не результат.
    Код (Text):
    1. movd   mm0,eax
    2. movq   mm1,mm0
    3. psllq  mm1,28
    4. por    mm0,mm1
    5. mov    ax,$0F0F
    6. pinsrw mm1,eax,0
    7. pshufw mm1,mm1,0
    8. pand   mm0,mm1
    9. movq   mm2,mm1
    10. psrlw  mm1,3
    11. pand   mm1,mm2
    12. mov ecx,16
    13. @@:movq     mm3,mm2
    14.    pcmpeqb  mm3,mm0
    15.    pmovmskb eax,mm3
    16.    psubb    mm2,mm1
    17.    popcnt   eax,eax
    18.    sub      al,1
    19.    jnle @f
    20. loop @b
    21. @@:
    22. sbb eax,eax
     
  15. Serg50

    Serg50 New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2010
    Сообщения:
    48
    Насколько я понял вариантавтора - 29 комманд, байты не считал. Я слегка не дотянул - вариант 30 комманд, без цикла, 83 байта:

    Код (Text):
    1.     mov     esi, eax
    2.     mov     ebx, eax
    3.     mov     ecx, eax
    4.     mov     edx, eax
    5.     ror     esi, 4
    6.     xor     eax, esi
    7.     ror     esi, 4
    8.     xor     ebx, esi
    9.     ror     esi, 4
    10.     xor     ecx, esi
    11.     ror     esi, 4
    12.     xor     edx, esi
    13.     lea     esi, [eax-11111111h]
    14.     not     eax
    15.     and     eax, esi
    16.     lea     esi, [ebx-11111111h]
    17.     not     ebx
    18.     and     ebx, esi
    19.     or      eax, ebx
    20.     lea     esi, [ecx-11111111h]
    21.     not     ecx
    22.     and     ecx, esi
    23.     or      eax, ecx
    24.     lea     esi, [edx-11111111h]
    25.     not     edx
    26.     and     edx, esi
    27.     or      eax, edx
    28.     and     eax, 88888888h
    29.     neg     eax
    30.     sbb     eax, eax
     
  16. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    с циклом 46 байт + 16 байт данные
    Код (Text):
    1.     xor ebp,ebp
    2.     xor edx,edx
    3.     mov esi,offset tabl
    4.     mov ecx,8
    5. a1: mov ebx,eax
    6.     and ebx,0Fh
    7.     add byte ptr [esi+ebx],1
    8.     shr eax,4
    9.     loop a1
    10.     mov ebx,0FEFEFEFEh
    11.     mov cl,4
    12. a2: lodsd
    13.     and eax,ebx
    14.     setnz dl
    15.     or ebp,edx
    16.     loop a2
    17.     xchg eax,ebp
    18.     dec eax
    19. tabl db 16 dup (0)
     
  17. Serg50

    Serg50 New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2010
    Сообщения:
    48
    Вариант автора - 29 комманд, я немного не дотянул - 30. Без цикла, 83 байта.

    Код (Text):
    1.     mov     esi, eax
    2.     mov     ebx, eax
    3.     mov     ecx, eax
    4.     mov     edx, eax
    5.     ror     esi, 4
    6.     xor     eax, esi
    7.     ror     esi, 4
    8.     xor     ebx, esi
    9.     ror     esi, 4
    10.     xor     ecx, esi
    11.     ror     esi, 4
    12.     xor     edx, esi
    13.     lea     esi, [eax-11111111h]
    14.     not     eax
    15.     and     eax, esi
    16.     lea     esi, [ebx-11111111h]
    17.     not     ebx
    18.     and     ebx, esi
    19.     or      eax, ebx
    20.     lea     esi, [ecx-11111111h]
    21.     not     ecx
    22.     and     ecx, esi
    23.     or      eax, ecx
    24.     lea     esi, [edx-11111111h]
    25.     not     edx
    26.     and     edx, esi
    27.     or      eax, edx
    28.     and     eax, 88888888h
    29.     neg     eax
    30.     sbb     eax, eax
     
  18. Serg50

    Serg50 New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2010
    Сообщения:
    48
    Извиняюсь, что 2 раза - то ли у меня глюк, то ли на сайте. Пост вроде ушел, но в теме не появился. Только через минуту :)
     
  19. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Black_mirror
    Где вариант без цикла, там нет опечаток? Либо я, кажется, малость не понимаю:
    И зачем rol eax, cl в самом начале, когда не проверен первый байт?
    И вообще я не согласен с bts edx, eax когда в eax биты кроме тех что содержатся в al не пусты.
     
  20. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    Black_mirror
    На выходе не восстанавливает mm0..mm2, flags.
    Возвращаемые значения неумышленно противоположны: 0 <-> -1 - используйте
    Код (Text):
    1.         not     eax
    2.         jz      ...
    Код (Text):
    1. format pe gui 4.0
    2. include 'win32a.inc'
    3.  
    4.  
    5. section '' code import readable writable executable
    6. library kernel32,'kernel32.dll'
    7. include 'api\kernel32.inc'
    8.  
    9.  
    10. entry $
    11.         stdcall p1,$1234abcd,$10000000
    12.         invoke  ExitProcess,0
    13.  
    14.  
    15. proc p1; v1,v2
    16.         mov     eax,[esp+4]
    17.         movd    mm0,eax
    18.         shr     eax,4
    19.         movd    mm1,eax
    20.         punpcklbw mm0,mm1
    21.  
    22.         mov     eax,[esp+8]
    23.         movd    mm1,eax
    24.         shr     eax,4
    25.         movd    mm2,eax
    26.         punpcklbw mm1,mm2
    27.  
    28.         ;push    $0f0f0f0f $0f0f0f0f
    29.         ;pand    mm0,[esp]
    30.         ;pand    mm1,[esp]
    31.         ;add     esp,8
    32.  
    33.         pcmpeqb mm0,mm1
    34.         movq    [esp+4],mm0
    35.         movd    eax,mm0
    36.         or      eax,[esp+8]
    37.         jz      .done
    38.         or      eax,-1
    39.  
    40. .done:  ret     8
    41. endp