Буфер сам меняет содержимое?

Тема в разделе "WASM.BEGINNERS", создана пользователем Processor, 18 мар 2008.

  1. ofCros

    ofCros New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    25
    Ещё один вариант.

    Если изначально надо знать длину текста в 129 байтовом буфере(fasm):

    Код (Text):
    1. Buf db 'text',0
    2. l_Buf=$-Buf
    3. db 129-($-Buf) dup (0)
    Или при записи в буфер.
    Код (Text):
    1. mov edi,Txt
    2.  
    3. mov esi,Buf
    4. ;----------
    5.   mov ecx,129 ;макс. размер буфера.
    6.   xor edx,edx
    7. Loops:
    8.   dec ecx
    9.    jz BuferOverflov
    10.   mov al,[edi+edx]
    11.   mov [esi+edx],al
    12.   inc edx
    13.   test al,-1
    14.    jnz Loops
    15.   ;------------
    16. TheEnd:
    17. . . . . . . .
    18. BuferOverflov:
    19. ...если надо обработаем
     
  2. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    boobl
    При длине буфера в N байтов можно найти завершающий ноль за log (N) шагов
    Код (Text):
    1.      xor esi,esi;в esi индекс первого элемента просматриваемой части
    2.      mov edi,N-1;в edi индекс последнего элемента просматриваемой части
    3.      xor al,al; ищем завершающий ноль
    4. a1: cmp esi,edi;проверка на окончание поиска (esi>edi)
    5.       ja exit
    6.       mov ebx,esi
    7.       add ebx,edi
    8.       shr ebx,1
    9.       cmp buffer[ebx],al
    10.       jnz a2
    11.       mov edi,ebx; меняем правую границу
    12.       dec edi;учтем только что проверенное значение
    13.       jmp a1  
    14. a2:  mov esi,ebx; меняем левую границу
    15.       inc esi;учтем только что проверенное значение
    16.       jmp a1
    17. exit: ; в edi количество символов
     
  3. boobl

    boobl New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    18
    Проведем небольшой синтетический тест.
    Вот код:
    Код (Text):
    1. mystrlen proc   buf:DWORD
    2.     or ecx,-1
    3.     xor al,al
    4.     mov edi, buf
    5.     repne scasb
    6.     not ecx
    7.     mov eax, ecx
    8.     ret
    9. mystrlen endp
    10.  
    11. start:
    12.     invoke  GetProcessHeap
    13.     mov     hHeap, eax
    14.  
    15. ;   Выделим памяти на 100000000 символов
    16.     invoke  HeapAlloc, hHeap, 0, 100000000
    17.     test    eax, eax
    18.     je      fail
    19.     mov     pStr, eax
    20.    
    21. ;   Заполним какой-нибудь дрянью
    22.     mov     ecx, 99999999
    23.     mov     bl, 0BAh
    24. lop:
    25.     mov     [eax + ecx - 1], bl
    26.     xor     bl, cl
    27.     or      bl, 1
    28.     dec     ecx
    29.     jne     lop
    30.    
    31. ;   засекаем GetTickCount и считаем длину
    32.     invoke  GetTickCount
    33.     mov     gtc, eax
    34.     invoke  StrLen, pStr
    35.     invoke  GetTickCount
    36.     sub     eax, gtc
    37.     invoke  dwtoa, eax, ADDR num
    38. ;   выводим кол-во милисекунд
    39.     invoke  StdOut, ADDR num
    40.     invoke  StdOut, ADDR endl
    41.    
    42. ;   теперь с собственнонаписанной ф-цией
    43.     invoke  GetTickCount
    44.     mov     gtc, eax
    45.     invoke  mystrlen, pStr
    46.     invoke  GetTickCount
    47.     sub     eax, gtc
    48.     invoke  dwtoa, eax, ADDR num
    49.     invoke  StdOut, ADDR num
    50.     invoke  StdOut, ADDR endl
    51. fail:
    52.     exit
    53. end start
    Вот результат:
    Код (Text):
    1. C:\masm32\prj\strlen>test
    2. 470
    3. 771
    Выходит, strlen из библиотеки masm в 1,6 раз быстрее.
     
  4. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    boobl
    ТС не ставил задачу оптимизировать по скорости
     
  5. boobl

    boobl New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    18
    Забавный алгоритм, напомнил мне про численные методы оптимизации ф-ций на лекциях вычислительной математики. Однако же, он требует чтобы буфер всегда был изначально заполнен нулями.
     
  6. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    boobl
    Можно еще и так
    Код (Text):
    1.        xor ecx,ecx
    2.        mov ebx,4
    3. a0:    mov eax,buff[ecx]
    4.        test eax,0FF000000h
    5.        jz a1
    6.        test eax,0FF0000h
    7.        jz a2
    8.        test eax,0FF00h
    9.        jz a3
    10.        test eax,0FFh
    11.        jz a4              
    12.        jmp a5
    13. a2:    dec ebx
    14. a3:    dec ebx
    15. a4:    dec ebx
    16. a5:    lea ecx,[ecx+ebx]
    17.         cmp ebx,4
    18.         je a0
    19. a1:; в ecx количество символов до первого нулевого
     
  7. boobl

    boobl New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    18
    Mikl__
    очень неплохой алгоритм, медленнее масмового всего в 1.23 раза
     
  8. ofCros

    ofCros New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    25
    Или так.

    Код (Text):
    1. mov esi,Buf
    2. xor ecx,ecx
    3.  
    4. @@:
    5.  test byte[esi+ecx],0ffh
    6.   jz @f
    7.  inc ecx
    8.   jmp @b
    9. @@:
    10.  
    11.  cmp ecx,129
    12.   jae Overflov
     
  9. Processor

    Processor New Member

    Публикаций:
    0
    Регистрация:
    15 мар 2008
    Сообщения:
    46
    Что такое Overflov ?
    аналог jmp ?
    Это MASM ?
     
  10. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
  11. ofCros

    ofCros New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    25
    Я имел ввиду метку, где обработать переполнение. Нет это fasm.
     
  12. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    leo
    О да, эти топики - уже классика. Надо читать всем. А не изобретать велосипед.
     
  13. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    TermoSINteZ
    Замечательно, что эта тема поднималась в 2005 году, а фраза
    говорит о том, что обсуждение ее было еще раньше...
    Поиск, поиск и еще раз поиск, но при этом не стоит отбивать руки фразой об изобретении велосипеда...
     
  14. zoool

    zoool New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2007
    Сообщения:
    412
    Считать ничего не нужно
    GetWindowTextA / W - возвращает количество символов полученной строки.
     
  15. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Тогда и писать ничего не нужно - все сделают дяди из M$, сиди и дожидайся готовых компонентов, или заказывай за деньги:)
     
  16. zoool

    zoool New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2007
    Сообщения:
    412
    Mikl__
    вы видимио путаете GetWindowsTextA и lstrlenA

    ЗЫ: И я так понял, к каждой программе вы пишите свое ядро или даже свою ОС?? А хуле дожидаться майкрософт, кода можно свою ось написать.
    ЗЗЫ: горите флудеры (С) ЭвилФрик
     
  17. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    zoool
    Зря вы злитесь, иногда (в зависимости от обстоятельств) строковые инструкции предпочтительнее API-функций, а иногда стоит размять мозги
     
  18. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    тогда, когда из .dll'ки импортируется одна функция, которую не мешало бы тупо заинлайнить )