Поиск символа в строке

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

  1. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Вот часть кода, в котором нужно найти символ & в строке
    что в нём не так???

    Код (Text):
    1. mov al, "&" ; что будем искать
    2. mov ecx, 65530 ; записать в счётчик 65530 (размер сканируемой строки)
    3. repne scasb ; поиск & в массиве из 65530 байт
    4. jcxz exit ; переход на метку  incorrect , если не нашли
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    1) edi?
    2) jecxz?
    3) лучше вместо jecxz использовать просто jnz (без всяких сравнений)
     
  3. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Что-то никак не работает, как надо
    вот код
    сканируем строку вида login=stellaco&password=123&button=enter

    Код (Text):
    1. ;Секция не инициалезированных данных BSS
    2. section .bss
    3. http_login_param_buf resb 65536 ; зарезервировать память в 65536 байт
    4. fd resd 1 ; резервируем 8 байт для возвращаемого дескриптора функции open
    5. http_login_buf resb 100 ; зарезервировать память в 100 байт для логина переданного через форму.
    6.  
    7.  
    8. section .date
    9. http_login_string db "login=" ; строка login= передаваемая от клиента серверу
    10. path_file db 'test.txt',0
    11. global _start
    12. _start:
    13.  
    14. ;Системный вызов #3 read:
    15. mov eax, 3 ; syscall read
    16. mov ebx, 0 ; STD_IN
    17. mov ecx, http_login_param_buf ; адрес буфера для приёма параметров
    18. mov edx, 65536 ; длинна записываемых данных в байтах
    19. int 0x80 ; Обратится к ядру для возбуждения системного вызова
    20.  
    21. ;сканирование логина
    22. cld ; автоинкремент
    23. mov edi, http_login_param_buf ; буфер для всех принятых данных методом POST
    24. mov esi, http_login_string ; строка "login="
    25. mov ecx,6 ; сколько первых символов строк нужно сравнить  (адресуемые регистрами ESI и EDI)
    26. rep cmpsb  ; сравниваем две строки, адресуемые регистрами ESI и EDI
    27. jnz exit ; проверяем флаг нуля, если не ноль, то строки не совпали и прыгаем на incorrect
    28. ; до этого момента проблем нет
    29. mov al, "&" ; что будем искать
    30. mov ecx, 65530 ; записать в счётчик 65530 (размер сканируемой строки)
    31. repne scasb ; поиск & в массиве из 65530 байт
    32. jnz exit ; переход на метку  incorrect , если не нашли
    33. mov edx, 65530 ;
    34. sub edx, ecx ; в edx размер логина в байтах
    35. cmp edx, 100 ; узнаём, хватит  ли места в BSS для логина (http_login_buf)
    36. jg exit ; если больше , (не хватит места в BSS для переданного логина) то incorrect
    37. mov esi, [http_login_param_buf+6] ; логин начинается тут
    38. mov edi, http_login_buf ; в edi адресс куда будем копировать логин
    39. mov ecx, edx ; счётчик равен колличеству символов в логине
    40. rep movsb ; повторить ecx раз, копирование [http_login_param_buf+6] в http_login_buf
    41. ;окончание сканирования логина
    42.  
    43.  
    44. ;системный вызов open
    45. mov eax,5 ; syscall open
    46. mov ebx,path_file
    47. mov ecx,0001002
    48. mov edx,7666
    49. int 0x80
    50. mov [fd],eax ; записываем в fd номер возвращённого дескриптора функции open
    51.  
    52. ;системный вызов write
    53. mov eax,4
    54. mov ebx,[fd] ; сохраняем в дескриптор открытого файла
    55. mov ecx, http_login_buf ; записываем логин
    56. ; edx равен колличеству символов в логине
    57. int 0x80
    58.  
    59.  
    60. ;системный вызов close
    61. mov eax,6
    62. mov ebx,[fd]
    63. int 0x80
    64.  
    65.  
    66.  
    67. exit:
    68. mov eax, 1 ; syscall exit
    69. xor ebx,ebx ; поместить 0 в ebx
    70. int 0x80 ; Обратится к ядру для возбуждения системного вызова
     
  4. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    какой смысл делать cgi приложение на ассемблере? больше времени потратится на его запуск...
     
  5. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    А разве скорость работы такого приложения не будет выше чем, скажем написанное на СИ ?
     
  6. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Будет выше конечно, но его же запустить еще надо, и на фоне общего времени (приема сервером запроса, запуск процесса, передача ему данных, прием данных от него, завершение процесса, предача сервером ответа) общий выигрыш может оказаться незначительным.

    Другое дело, если это модуль веб-сервера. Не зря считается, что ПХП меньше производит нагрузки на систему, чем перл, потому что перл каждый раз надо запускать, а ПХП всегда подгружен как модуль. (ПХП как cgi и костыли к перлу не в счет).
     
  7. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    А если как сервер использовать к примеру не апач, а собственный написанный код на асме. Который работает по аналогии с серверами из книги Стивенса "Создание сетевых приложений"
    То скорость будет, ещё чуточку повыше?
     
  8. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    stellaco
    Будет, само собой производительнее.
    Я как-то задумывался о написании специализированного веб-сервера под никс платформу. С самым необходимым минимумом функций, чтобы только умел отдавать статику и обязательно поддерживал дополнительные cgi модули в виде динамически подгружаемых библиотек. Никаких скриптов, никаких логов, никаких лишних файловых операций. Тщательно продуманная многопоточность и грамотная реализация на ассемблере - и будет веб-сервер с макимальной производительностью.
    Но, к сожалению, мешают суровые реалии юникс платформ. Там никто дальше Апача и Си думать не хочет.
    Несовместимость между версиями. Хотя есть надежда, что если использовать только низкоуровневые вызовы, без взаимодействия с какими-либо библиотеками, то возможно и получится переносимый исполняемый файл. Тут надо уже углубляться в юникс программирование.
    Как бы помягче выразится, несовершенство существующих средств разработки и отладки приложений под юникс. ИМХО, на асме там практически вобще никто не программирует, отладчиков нормальных нет и т.д.
    И сейчас я в раздумьях, может ну его нафик, эти юниксовые мучения, разрабатывать под винду, тут тебе и ассемблеры и отладчики и куча наработанного кода и бинарная совместимость. Я вот даже не знаю, есть ли в юниксах аналог виндовых портов завершения...
     
  9. TheBits

    TheBits Сергей

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    50
    Адрес:
    St.Petersburg
    При таком размере строки может будет выгоднее использовать SIMD возможности процессора? Это всем вопрос. И при каком размере строки уже будет невыгодно использовать SIMD?

    Вы какую задачу вообще решаете? От этого зависит ответ. Вам нужна бизнес-логика реализованная на ассемблере или свой сервер?
    Если второе то для начала сделайте просто сервер статики, который просто по запросу отдаёт статичный контенет (картинку например). Затем при помощи AB и нагрузочного тестирования сравните с nginx и lighthttpd (это самые популярные серверы статики, для рунета и зарубежа соответственно).

    Касательно того что php производит меньше нагрузки чем perl очень спорно! У нас так же может быть и mod_perl и FastCGI тут уже надо конкретные тесты проводить. Я думаю perl будет быстрее и легче. Несколько лет назад слышал что поисковые сервера яндекса работают на C/C++ и Perl. C++ я сам видел, perl не видел. Перл язык которому больше лет чем php. Интерпретатор за это время отшлифован наверное супер отлично. php как раз загибается в производительности на загрузке скрпита, его нужно весь загрузить. подключаешь класс, невооруженным глазом видно что скорость уменьшилась.
     
  10. scf

    scf Member

    Публикаций:
    0
    Регистрация:
    12 сен 2005
    Сообщения:
    386
    Не вижу практического смысла...
    получившийся продукт будет непереносим на другие платформы и, что самое главное, не сопровождаем, а, значит, бесполезен.
    Лучше написать работающее приложение на C/С++, а уже потом гонять его на тестах, оптимизируяю "узкие" места.
    Хотя.... сколько я написал прог, "не имеющих практического смысла", зато прикольных в разработке и давших бесценный опыт.
     
  11. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    TheBits
    Речь про то, что одно дело, когда с каждым запросом происходит создание процесса, другое - когда код всегда наготове, это конечно лучше.

    scf
    На какие платформы? Зачем его переносить? И почему он будет не сопровождаем?
     
  12. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    TheBits
    В данный момент я хочу сделать CGI (достаточно объёмное) приложение на ассемблере.
    Решил, что пора уже сосредоточиться на тех задачах, которыми хотел заниматься этак последние года три. Изначально изучал ассемблер (по собственному желанию) но потом затенил эти знания, всякой ерундой наподобии php sql css....и тд.
    Сейчас экстренно восстанавливаю свои познания в ассемблере и криптографии.
    Первоначально хочу полноценное cgi приложение. А затем, буду смотреть, что дальше смогу делать (очень хочу разбираться в устройстве субд).

    Насчёт simd, эту возможность буду рассматривать чуть позже.Для начала, хотелось бы, чтоб у меня просто заработала проверка введённых данных, в html форме.
     
  13. osrootd

    osrootd New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    1.086
    На одних сисколах полноценное CGI не построишь!
    А если тебе нужны будут регулярные выражения? То тоже на асме тебе придется подключать libregexp.so
    А это - либо через extern, либо через dlopen() (вызов библиотечной ф-ции), но для этого тебе потребуется libdl.so :)
     
  14. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    stellaco
    В современных камнях все строковые операции rep ... имеют большое время инициализации (оверхед), поэтому их вообще не имеет смысла использовать на коротких строках
     
  15. TheBits

    TheBits Сергей

    Публикаций:
    0
    Регистрация:
    7 апр 2006
    Сообщения:
    50
    Адрес:
    St.Petersburg
    @leo что использовать? SIMD можно? Строчки обычно от 0 до 1000байт.
     
  16. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    osrootd
    А если на одних сисколах, можно сделать переносимое приложение?
     
  17. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Я новичок, в асме, - никогда на нём ничего не программировал.
    Извените за вопросы, которые могут показаться глупыми.(хотя самый глупый вопрос, это тот, что не был задан)
    osrootd
    Раз уж были упомянуты регулярки, то если не трудно покажите, как подключить libregexp.so и использовать регулярные выражения в коде асм

    leo
    А чем их заменить то тогда?



    И мы сильно отошли от темы, моё сообщение Вчера 22:49:13 так и осталось без ответа.
    Посмотрите пожалуйста код приложения, там всё хорошо расписано. Где ошибка? как исправить?
     
  18. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    команда scasb берет байты из строки, на которую указывает edi. А у тебя указатель на строку "login=" пишется в esi.
     
  19. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Чтото я не совсем понял..
    Моя задача сейчас найти символ "&"в строке, которая записана в http_login_param_buf
    Начало сканируемоей строки идёт сразу после "login="

    Этот участок кода сравнивает первые 6 символов строки с "login="
    Сначала заносим в edi адрес http_login_param_buf
    Потом сравниваем символы ... указатели edi и esi увеличины на 6.. и указывают на первый символ после этих шести символов login=

    Код (Text):
    1. ;сканирование логина
    2. cld ; автоинкремент
    3. mov edi, http_login_param_buf ; буфер для всех принятых данных методом POST
    4. mov esi, http_login_string ; строка "login="
    5. mov ecx,6 ; сколько первых символов строк нужно сравнить  (адресуемые регистрами ESI и EDI)
    6. rep cmpsb  ; сравниваем две строки, адресуемые регистрами ESI и EDI
    7. jnz exit ; проверяем флаг нуля, если не ноль, то строки не совпали и прыгаем на incorrect
    8. ; до этого момента проблем нет
    Потом следует этот код
    Код (Text):
    1. mov al, "&" ; что будем искать
    2. mov ecx, 65530 ; записать в счётчик 65530 (размер сканируемой строки)
    3. repne scasb ; поиск & в массиве из 65530 байт
    4. jnz exit ; переход на метку  incorrect , если не нашли
    так как scasb начинает сканирование с начального адреса в edi (а он уже записан там) , то начинаем просматривать весь логин.... (принятые данные начинающиеся после символов "login="ЛОГИН_ЛОГИН_ЛОГИН) вплоть до разделителя &
    (Через scasb ищу разделитель "&" )

    Разъясните, в чём я не прав....
     
  20. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Ну я не знаю. Все вроде правильно. Может ошибка у тебя в другом месте?
    Запусти под отладчиком и проверь - действительно ли в edi адрес нужной строки.

    P. S. Длина строки у тебя слижком длинная. Ты же фактическую длину строки не считаешь? После сравнения с '&' проверяй на равенство с 0x00. Если текущий байт == 0x00, значит мы дошли до конца строки. А так может возникнуть переполнение буфера при чтении (если фактическая длина строки меньше 65530). Но это вряд ли относится к ошибке.