работа со строками под Windows

Тема в разделе "WASM.BEGINNERS", создана пользователем xlinuks, 28 май 2006.

  1. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    Привет,

    Кто нибудь знает какой нибудь ресурс где есть толковое руководство или чтото в этом роде о работе со строками на ассемблере под Windows, чтобы после этого можно было самому писать что-то вроде
    Код (Text):
    1. mov al, byte ptr [string+3]


    Туториал Iczeliona классный, но про строки практически ничего не сказано, а жаль, мог бы включить главу на это тему, например про substring, indexOf, charAt и все такое.. очень нужно в повседневном программировании..
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine

    Код (Text):
    1.  
    2. str1 db 'hello' ; строковый буфер
    3. str2 dd ?       ; указатель на строку
    4. ..
    5. mov  edx,offset str1
    6. mov  al,byte ptr[edx+3]
    7.  
    8. mov  edx,[str2]
    9. mov  al,byte ptr[edx+3]




    Насчёт строковых функций - покопай \masm32\m32lib\*.asm
     
  3. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    До меня начинает доходить, но всеже [edx+3] - три это неслучайный индекс или же там вполне может быть и 2 и 200.

    Я коечто откопал в самом хелпе ассемблера, но ГЛАВНОЕ что я не пойму, это как ассемблер знает когда конец строки, ведь если только по нулю то что если строка содержит нуль как например "you entered 0 instead of 25!", здесь же тоже есть ноль! Вот пример что я нашел который сортирует строку оставляя только цифры если как таковы имеются:
    Код (Text):
    1.  
    2. NumOnly proc source :DWORD, dest:DWORD
    3.  
    4.     mov ecx, source     ; put address into ecx
    5.  
    6.     mov edx, dest       ; put address into edx
    7.  
    8.   @@:
    9.     mov al, [ecx]   ; copy byte at address in ecx to al
    10.     inc ecx             ; increment address in ecx
    11.   ; -----------------------------------------------------
    12.   ; perform byte modification, replacement  or omissions
    13.   ; -----------------------------------------------------
    14.     cmp al, 0    ;ЗДЕСЬ!!!!  test for zero first
    15.     je  @F              ; exit loop on ascii zero
    16.  
    17.     cmp al, "0"  ;И ЗДЕСЬ!! string literal
    18.     jb @B               ; if below 48 "0", jump back
    19.     cmp al, "9"         ; string literal
    20.     ja @B               ; if above 57 "9", jump back
    21.   ; ------------------------------------------------------
    22.     mov [edx], al   ; copy byte in al to address in edx
    23.     inc edx         ; increment address in edx
    24.     jmp @B
    25.  
    26.   @@:
    27.     mov [edx], al ; copy ascii zero to address in EDI
    28.  
    29.     ret
    30.  
    31. NumOnly endp
    32.  


    А еще нужно найти про этот злощастный "ptr" о котором так старательно умалчивает масм 8-)

    На Яве все просто и ясно, но работает медленнее раз в 50, так что ассемблер лучшее решение учитывая что он почти не сложнее чем С, но работает быстрее чем эти два языка вместе взятые.. :)
     
  4. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Конец ASCIIZ-строки определяется по двоичному нулю (код - 00h), а символ "0" имеет код 30h



    ptr необходим для указания размера данных, считывамых по какому-либо адресу, т.к. размер приемника (напр. регистра) и источника (переменной) должны совпадать:


    Код (Text):
    1. mov al, byte ptr [12345678h] ; читаем байт по адресу 12345678h
    2. mov ax, word ptr [12345678h] ; читаем слово по адресу 12345678h
    3. mov eax, dword ptr [12345678h] ;  читаем двойное слово по адресу 12345678h
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    xlinuks



    Почитай про команды ассемблера. И вообще, найди или купи книгу, благо их сейчас много и почитай, сразу отпадёт много вопросов.
     
  6. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    Спасибо rmn!

    Доступно обьясняешь! Я кажесь понял: ptr указывает сколько прочесть с соответствующего адреса в памяти (в размере byte-а, word-а или dword-а и так далее). Ты не думал написать книжку по ассемблеру? Просто я искал в паре книг (чесно!) слово "ptr" и небыло там такого, не говоря уже что есть Tasm, Masm, HLA, и еще несколько *широко* известных *версий* ассемблера.
     
  7. warsem

    warsem Сеня

    Публикаций:
    0
    Регистрация:
    26 янв 2005
    Сообщения:
    170
    Адрес:
    Германия, NRW
    xlinuks

    "ptr указывает сколько прочесть с соответствующего адреса в памяти (в размере byte-а, word-а или dword-а и так далее)"

    Сколько скопировать из источника(то что после зпт) в приемник(то что до зпт)

    Еще есть вариант для ленивых:)
    Код (Text):
    1. mov al,1 ptr [12345678h]
    2. mov ax,2 ptr [12345678h]
    3. mov eax,4 ptr [12345678h]




    Советую так же посмотреть на опреции: lodsb/lodsw/lodsd

    Да и вообще есть много классный операторов для работы со строками:)
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    Сколько прочесть - это зависит от размера приёмника да и от команды, собственно (lodsb или если с префиксами rep*), а не источника. А ptr - для "ручного" указания размера источника в случае, если он не совпадает с размером приёмника.
     
  9. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Еще точнее ptr - это оператор приведения типа переменной

    Асм при работе с операндами памяти контролирует соответствие типа\размера переменной размеру регистрового операнда - если совпадает, то никакие ptr не нужны. Если не совпадает, то асм предупреждает о возможной ошибке - тут кодер решает, либо он действительно ошибся в размере, либо "если так и задумано", то использует явное приведение типа\размера с помощью ptr, тут асм успокаивается и все довольны, все под контролем :)))



    PS: В случае же использования регистровой адресации асму проверять нечего - тут рулит IA-32 со своим набром инструкций, поэтому при mov al,[edx+3] или mov [edx+3], al никакие byte ptr не нужны (не обязательны), т.к. действительно в\из AL ничего кроме байта записать невозможно