Нужно решить одну задачку.

Тема в разделе "WASM.BEGINNERS", создана пользователем dead_body, 1 ноя 2006.

  1. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    На входе имеем количество двойных слов в массиве,сам массив и количество бит для каждого числа.
    Надо: положить в другой массив разкомпрессированые числа.

    пример, где в массиве два двойных слова, количество бит для каждого числа 4.
    на входе:
    10001010 10101111
    на выходе:
    00001000 00001010 00001010 00001111

    количество бит может быть любым в пределе от 1 до 31.
    приоритет - размер кода.
     
  2. Vasil

    Vasil Василь

    Публикаций:
    0
    Регистрация:
    7 янв 2006
    Сообщения:
    228
    Адрес:
    Ижевск
    dead_body

    - ну ты загнул...

    Тебе надо было тему здесь создавать ;)
    http://www.wasm.ru/forum/viewforum.php?id=26
     
  3. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    не ну вдруг у кого-то есть оптимизированый вариант, или кто-то из спортивного интереса захочет написать.
    просто я щас свой вариант пишу, так вот интересно, мой будет хуже или лучше.


    а так задачка вроде простенькая, так что расценю твой пост как шутку.
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    а в чём сложность?
    Я так понимаю в примере выхода ты указал только младшие слова двордов?
     
  5. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    Код (Text):
    1. .386
    2. .model flat,STDCALL
    3. include C:\temp\tasm\include\windows.inc
    4.  
    5.  
    6. extrn ExitProcess:PROC
    7.  
    8. .data
    9.     size_of_InMassiv dd 2
    10.     size_in_bits dd 16
    11.     in_massiv  db 1,2,4,3
    12.     out_massiv dd 4 DUP(?)
    13.  
    14.  
    15. .code
    16. Start:
    17.     mov esi,[size_of_InMassiv]
    18.     lea ebx,in_massiv
    19.     lea edi,out_massiv
    20.     mov ebp,[size_in_bits]
    21. work_on_dword:
    22.     xor edx,edx
    23.     mov ecx,32 
    24.     sub ecx,ebp
    25.     mov eax,[ebx]
    26. repeat_:   
    27.     shr eax,cl
    28.     mov [edi],eax
    29.     add edi,4
    30.     add edx,ebp
    31.     cmp edx,32
    32.     jz next
    33.     mov eax,[ebx]
    34.     push ecx   
    35.     mov ecx,edx
    36.     shl eax,cl
    37.     pop ecx
    38.     jmp repeat_
    39. next:   add ebx,4
    40.     dec esi
    41.     jnz work_on_dword
    42.  
    43.     push 0
    44.     call ExitProcess
    45. end Start
    ;Комментарии
    ;Пока, нельза давать в качестве размера числа, биты на которые не делиться 32.
    ;то есть можно давать 2,4,8,16.
    ;проверок никаких не делаеться, так что если что получаем исключение.
    ;данная программа изменяет все регистры.
    ;что надо сделать?:
    ;вынести всё в отдельную процедуру, проверку параметров
    ;изменить диапазон вводимых значений размера битов(от 1 до 31).
    ;оптимизировать.
     
  6. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Код (Text):
    1. lea esi,in_massiv
    2. lea edi, out_massiv
    3. xor edx,edx
    4. xor ebx,ebx
    5. get_next_dword:
    6. mov ecx,size_in_bits
    7. get_next_bit:
    8. or edx,edx
    9. jne @f
    10. lodsd
    11. dec size_of_InMassiv
    12. js exit
    13. mov edx,32
    14. @@:
    15. sar eax,1
    16. sal ebx,1
    17. dec ecx
    18. je get_next_bit
    19. xor eax,eax
    20. xchg eax,ebx
    21. stosb
    22. jmp get_next_dword
    23. exit:
    Не проверял, но что-то вроде этого.
     
  7. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    asd
    спасибо, твой пример мне помог.


    вот код работающий, который у меня получился.
    Код (Text):
    1. .386
    2. .model flat,STDCALL
    3.  
    4. extrn ExitProcess:PROC
    5.  
    6. .data
    7.     size_of_InMassiv dd 2
    8.     in_massiv  dd 0FF020403h
    9.            dd 0EE000911h
    10.     size_in_bits dd 8
    11.     out_massiv dd 80 DUP(?)
    12.  
    13.  
    14. .code
    15. Start:
    16.     lea esi,in_massiv
    17.     lea edi,out_massiv
    18.     xor ecx,ecx
    19.     mov eax,[esi]
    20. process_next_number:
    21.     mov ebp,[size_in_bits]
    22.     dec esi
    23.     xor edx,edx
    24. process_next_bit_in_this_dword:
    25.     shl eax,1
    26.     jnc not_set
    27.     bts edx,ebp
    28. not_set:   
    29.     inc ecx
    30.     cmp ecx,32
    31.     jz load_next_dword
    32. dword_ready:
    33.     dec ebp
    34.     jns process_next_bit_in_this_dword
    35.     mov [edi],edx
    36.     add edi,4
    37.     jmp process_next_number
    38. load_next_dword:
    39.     dec [size_of_InMassiv]
    40.     jz end_all
    41.     add esi,4
    42.     mov eax,[esi]
    43.     xor ecx,ecx
    44.     jmp dword_ready
    45. end_all:   mov [edi],edx
    46.     int 3
    47.     call ExitProcess,0
    48. end Start
    ;Исходный размер получаеться 15373 килобайт.(дебаг)
    ;размер релиза 8192.
    ;просто ради интереса, в FASMе размер 2500 килобайт. :)


    кто может, переписать это на С?(С++)
    по идее тут нс С, пару строчек.