asm strrev

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

  1. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Пооптимизируем вместе
    Код (Text):
    1. .data
    2.     String  db  "String to reverse",0
    3.     lenStr  equ (($ - String)-1)
    4. .code
    5.  
    6. EntryPoint:
    7.     call    strrev
    8.     ret
    9.    
    10. ; IN OUT ESI - указывает на строку
    11. strrev:
    12.     xor     ecx, ecx        ;Ecx=0
    13.     xor edx, edx        ;Edx=0
    14.     mov     edx, lenStr         ;Ecx=len
    15.    
    16.     lea esi, String
    17.     lea edi, String
    18.    
    19. __1:     lodsb              ;AL = первый символ
    20.     cmp ecx, edx
    21.     jnb __2
    22.    
    23.     mov     bl, byte ptr[edi + edx-1]   ;BL = последний символ
    24.  
    25.     mov     byte ptr[esi-1], bl ;Первый символ=Последний символ
    26.     mov byte ptr[edi + edx-1], al   ;Последний символ=Первый символ
    27.    
    28.     inc ecx
    29.     dec edx
    30.     jmp __1
    31.    
    32. __2:retn
    33. end EntryPoint
    В Си во встроенных функциях есть strrev(), но вот мой вариант

    Код (Text):
    1. ///////////////////////////////////////////////////////////////
    2. // алгоритм следующий:
    3. // 1. сохраняем первый символ
    4. // 2. перезаписываем первый символ последним
    5. // 3. перезаписываем последний символ сохраненным первым
    6. ///////////////////////////////////////////////////////////////
    7. void x_reverse(char s[])
    8. {
    9.     // Где i - начало
    10.     //     j - конец
    11.     //     c - символ для сохранения
    12.  
    13.     register int i = 0, j = strlen(s) - 1;
    14.     register char c;
    15.  
    16.     for (; i < j; i++, j--) {
    17.    
    18.         // 1
    19.         c = s[i];
    20.         // 2
    21.         s[i] = s[j];
    22.         // 3
    23.         s[j] = c;
    24.     }
    25. }
     
  2. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    bswap можно использовать!
     
  3. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    t00x Спасибо, стыдно канэшна, но незнаю как пользоваться, вот набросок поправь пжлста
    Код (Text):
    1. strrev2:
    2.     xor ecx, ecx
    3.     lea esi, String
    4. @@:     lodsd
    5.            bswap    eax
    6.     ;mov    [esi-dword + ecx], eax
    7.     ;add    ecx, 4
    8.          ; [...]
     
  4. PowerASM

    PowerASM New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    59
    я бы сделал так
    Код (Text):
    1. lea esi, String
    2. mov edi, String
    3. mov edx, lenStr
    4. lea ebx, [esi+edx-1]
    5. jmp a
    6. e:
    7. lodsb
    8. xchg [ebx], al
    9. stosb
    10. dec ebx
    11. a:
    12. cmp esi, ebx
    13. jc e
    что эквивалентно коду приведенному на си с той лишь разницей, что и счетчик и указатель это одна переменная или сразу по 4 байта, а потом по одному, что останется
    Код (Text):
    1. lea esi, String
    2. mov edi, esi
    3. mov ebx, edi
    4. xor eax, eax
    5. ln:
    6. cmp al, [ebx]
    7. inc ebx
    8. jc ln
    9. mov ecx, edx
    10. shr ecx, 3
    11. jz l1
    12. l0:
    13. sub ebx, 4
    14. lodsd
    15. bswap eax
    16. xchg [ebx], eax
    17. bswap eax
    18. stosd
    19. loop l0
    20. l1:
    21. cmp esi, ebx
    22. jae l2
    23. lodsb
    24. dec ebx
    25. xchg [ebx], al
    26. stosb
    27. jmp l1
    28. l2:
     
  5. PowerASM

    PowerASM New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    59
    простите. забыл поменять
    Код (Text):
    1. mov ecx, edx
    на
    Код (Text):
    1. mov ecx, ebx
    2. sub ecx, edi