Оптимизация кода

Тема в разделе "WASM.ASSEMBLER", создана пользователем t00x, 14 ноя 2007.

  1. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    простенькая задачка.
    на входе дан массив байтов "data9", подсчитать количество одинаковых байтов в "pdata".
    сократить массив "data9", чтобы остались исключительно разные байты.
    Код (Text):
    1.         mov esi, data9                  ; in data
    2.         mov ebp, pdata                   ; out data
    3.         mov edx, esi                       ; save esi
    4.  
    5. @next_data9:
    6.         mov bl, [esi]
    7.         xor ecx, ecx
    8.         test bl, bl
    9.         jz @exit                        ; no more data9
    10.  
    11.         mov edi, esi
    12.         add cl, 1
    13. @loop:
    14.         mov al, [esi + ecx]
    15.         cmp bl, al
    16.         jne @ne                         ; data9[0] = current data ?
    17.  
    18.         add cl, 1
    19.         jmp @loop
    20. @ne:
    21.         stc
    22.         adc esi, ecx
    23.         add byte [ebp], cl              ;
    24.         add edi, 1                      ;
    25.         xor cl, cl
    26.         mov [edi], al                   ;
    27.         cmp al, 0
    28.         jnz @loop
    29.  
    30.         add edx, 1
    31.         add ebp, 1
    32.         mov esi, edx
    33.         jmp @next_data9                 ; next
    34. @exit:
    35. align 8
    36. data9   db 1, 1, 1, 4, 5, 1, 3, 5, 7, 0
    37. align 8
    38. pdata   db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    P.S. оптимизация по скорости, и хорошо бы, количеству итераций
    P.P.S. освобождение регистра тоже полезно будет )
     
  2. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    t00xЧуть изменю условие: на выходе будет массив rdata со структурой символ:сколько раз встретился
    Код (Text):
    1. .data
    2. data9 db 1, 1, 1, 4, 5, 1, 3, 5, 7, 0
    3. pdata db 512 dup (0)
    4. rdata db 512 dup (0)
    5. .code
    6.      xor eax,eax
    7.      mov edi,offset pdata
    8.      mov esi,offset data9
    9.      mov ebx,offset rdata
    10. a1: mov al,[esi]
    11.      add esi,1
    12.      test al,al
    13.      jz exit
    14.      add byte ptr[edi+eax*2+1],1
    15.      mov [edi+eax*2],al
    16.      jmp a1
    17. exit: mov ecx,256
    18. a2: mov ax,[edi]
    19.      add edi,2
    20.      test al,al
    21.      jz a3
    22.      mov [ebx],ax
    23.      add ebx,2
    24. a3: sub ecx,1
    25.      jnz a2
     
  3. Novi4ek

    Novi4ek New Member

    Публикаций:
    0
    Регистрация:
    3 авг 2007
    Сообщения:
    317
    Чуть изменю условие задачи: теперь программа ничего не делает:

    Код (Text):
    1. nop
     
  4. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Novi4ek
    ))))))))))) ой рассмешил нимагу
     
  5. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Novi4ek
    Ваша программа, уважаемый, неэффективна: в ней есть одна лишняя инструкция :-P :)
     
  6. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Novi4ek
    Напрасно смеетесь, полученный массив это транспонированная матрица (Nx2) привести ее к нормальному (требуемому) виду т.е. (2xN) не сложно:
    Код (Text):
    1. .data
    2. mas db dup (N*2); исходная матрица
    3. _mas db dup (N*2); транспонированная матрица
    4. .code
    5.     mov esi,N
    6. m1: mov ax,mas[esi*2]
    7.       mov _mas[esi],al
    8.       mov _mas[esi+N],ah
    9.       sub esi,1
    10.       jnz m1
    P.S. в зависимости от N цикл можно развернуть
     
  7. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    сорц и ехе в аттаче
     
  8. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Mikl__
    Спасибо, посмотрел.