Привет, Кто нибудь знает какой нибудь ресурс где есть толковое руководство или чтото в этом роде о работе со строками на ассемблере под Windows, чтобы после этого можно было самому писать что-то вроде Код (Text): mov al, byte ptr [string+3] Туториал Iczeliona классный, но про строки практически ничего не сказано, а жаль, мог бы включить главу на это тему, например про substring, indexOf, charAt и все такое.. очень нужно в повседневном программировании..
Код (Text): str1 db 'hello' ; строковый буфер str2 dd ? ; указатель на строку .. mov edx,offset str1 mov al,byte ptr[edx+3] mov edx,[str2] mov al,byte ptr[edx+3] Насчёт строковых функций - покопай \masm32\m32lib\*.asm
До меня начинает доходить, но всеже [edx+3] - три это неслучайный индекс или же там вполне может быть и 2 и 200. Я коечто откопал в самом хелпе ассемблера, но ГЛАВНОЕ что я не пойму, это как ассемблер знает когда конец строки, ведь если только по нулю то что если строка содержит нуль как например "you entered 0 instead of 25!", здесь же тоже есть ноль! Вот пример что я нашел который сортирует строку оставляя только цифры если как таковы имеются: Код (Text): NumOnly proc source :DWORD, dest:DWORD mov ecx, source ; put address into ecx mov edx, dest ; put address into edx @@: mov al, [ecx] ; copy byte at address in ecx to al inc ecx ; increment address in ecx ; ----------------------------------------------------- ; perform byte modification, replacement or omissions ; ----------------------------------------------------- cmp al, 0 ;ЗДЕСЬ!!!! test for zero first je @F ; exit loop on ascii zero cmp al, "0" ;И ЗДЕСЬ!! string literal jb @B ; if below 48 "0", jump back cmp al, "9" ; string literal ja @B ; if above 57 "9", jump back ; ------------------------------------------------------ mov [edx], al ; copy byte in al to address in edx inc edx ; increment address in edx jmp @B @@: mov [edx], al ; copy ascii zero to address in EDI ret NumOnly endp А еще нужно найти про этот злощастный "ptr" о котором так старательно умалчивает масм 8-) На Яве все просто и ясно, но работает медленнее раз в 50, так что ассемблер лучшее решение учитывая что он почти не сложнее чем С, но работает быстрее чем эти два языка вместе взятые..
Конец ASCIIZ-строки определяется по двоичному нулю (код - 00h), а символ "0" имеет код 30h ptr необходим для указания размера данных, считывамых по какому-либо адресу, т.к. размер приемника (напр. регистра) и источника (переменной) должны совпадать: Код (Text): mov al, byte ptr [12345678h] ; читаем байт по адресу 12345678h mov ax, word ptr [12345678h] ; читаем слово по адресу 12345678h mov eax, dword ptr [12345678h] ; читаем двойное слово по адресу 12345678h
xlinuks Почитай про команды ассемблера. И вообще, найди или купи книгу, благо их сейчас много и почитай, сразу отпадёт много вопросов.
Спасибо rmn! Доступно обьясняешь! Я кажесь понял: ptr указывает сколько прочесть с соответствующего адреса в памяти (в размере byte-а, word-а или dword-а и так далее). Ты не думал написать книжку по ассемблеру? Просто я искал в паре книг (чесно!) слово "ptr" и небыло там такого, не говоря уже что есть Tasm, Masm, HLA, и еще несколько *широко* известных *версий* ассемблера.
xlinuks "ptr указывает сколько прочесть с соответствующего адреса в памяти (в размере byte-а, word-а или dword-а и так далее)" Сколько скопировать из источника(то что после зпт) в приемник(то что до зпт) Еще есть вариант для ленивых Код (Text): mov al,1 ptr [12345678h] mov ax,2 ptr [12345678h] mov eax,4 ptr [12345678h] Советую так же посмотреть на опреции: lodsb/lodsw/lodsd Да и вообще есть много классный операторов для работы со строками
Сколько прочесть - это зависит от размера приёмника да и от команды, собственно (lodsb или если с префиксами rep*), а не источника. А ptr - для "ручного" указания размера источника в случае, если он не совпадает с размером приёмника.
Еще точнее ptr - это оператор приведения типа переменной Асм при работе с операндами памяти контролирует соответствие типа\размера переменной размеру регистрового операнда - если совпадает, то никакие ptr не нужны. Если не совпадает, то асм предупреждает о возможной ошибке - тут кодер решает, либо он действительно ошибся в размере, либо "если так и задумано", то использует явное приведение типа\размера с помощью ptr, тут асм успокаивается и все довольны, все под контролем )) PS: В случае же использования регистровой адресации асму проверять нечего - тут рулит IA-32 со своим набром инструкций, поэтому при mov al,[edx+3] или mov [edx+3], al никакие byte ptr не нужны (не обязательны), т.к. действительно в\из AL ничего кроме байта записать невозможно