Вот часть кода, в котором нужно найти символ & в строке что в нём не так??? Код (Text): mov al, "&" ; что будем искать mov ecx, 65530 ; записать в счётчик 65530 (размер сканируемой строки) repne scasb ; поиск & в массиве из 65530 байт jcxz exit ; переход на метку incorrect , если не нашли
Что-то никак не работает, как надо вот код сканируем строку вида login=stellaco&password=123&button=enter Код (Text): ;Секция не инициалезированных данных BSS section .bss http_login_param_buf resb 65536 ; зарезервировать память в 65536 байт fd resd 1 ; резервируем 8 байт для возвращаемого дескриптора функции open http_login_buf resb 100 ; зарезервировать память в 100 байт для логина переданного через форму. section .date http_login_string db "login=" ; строка login= передаваемая от клиента серверу path_file db 'test.txt',0 global _start _start: ;Системный вызов #3 read: mov eax, 3 ; syscall read mov ebx, 0 ; STD_IN mov ecx, http_login_param_buf ; адрес буфера для приёма параметров mov edx, 65536 ; длинна записываемых данных в байтах int 0x80 ; Обратится к ядру для возбуждения системного вызова ;сканирование логина cld ; автоинкремент mov edi, http_login_param_buf ; буфер для всех принятых данных методом POST mov esi, http_login_string ; строка "login=" mov ecx,6 ; сколько первых символов строк нужно сравнить (адресуемые регистрами ESI и EDI) rep cmpsb ; сравниваем две строки, адресуемые регистрами ESI и EDI jnz exit ; проверяем флаг нуля, если не ноль, то строки не совпали и прыгаем на incorrect ; до этого момента проблем нет mov al, "&" ; что будем искать mov ecx, 65530 ; записать в счётчик 65530 (размер сканируемой строки) repne scasb ; поиск & в массиве из 65530 байт jnz exit ; переход на метку incorrect , если не нашли mov edx, 65530 ; sub edx, ecx ; в edx размер логина в байтах cmp edx, 100 ; узнаём, хватит ли места в BSS для логина (http_login_buf) jg exit ; если больше , (не хватит места в BSS для переданного логина) то incorrect mov esi, [http_login_param_buf+6] ; логин начинается тут mov edi, http_login_buf ; в edi адресс куда будем копировать логин mov ecx, edx ; счётчик равен колличеству символов в логине rep movsb ; повторить ecx раз, копирование [http_login_param_buf+6] в http_login_buf ;окончание сканирования логина ;системный вызов open mov eax,5 ; syscall open mov ebx,path_file mov ecx,0001002 mov edx,7666 int 0x80 mov [fd],eax ; записываем в fd номер возвращённого дескриптора функции open ;системный вызов write mov eax,4 mov ebx,[fd] ; сохраняем в дескриптор открытого файла mov ecx, http_login_buf ; записываем логин ; edx равен колличеству символов в логине int 0x80 ;системный вызов close mov eax,6 mov ebx,[fd] int 0x80 exit: mov eax, 1 ; syscall exit xor ebx,ebx ; поместить 0 в ebx int 0x80 ; Обратится к ядру для возбуждения системного вызова
Будет выше конечно, но его же запустить еще надо, и на фоне общего времени (приема сервером запроса, запуск процесса, передача ему данных, прием данных от него, завершение процесса, предача сервером ответа) общий выигрыш может оказаться незначительным. Другое дело, если это модуль веб-сервера. Не зря считается, что ПХП меньше производит нагрузки на систему, чем перл, потому что перл каждый раз надо запускать, а ПХП всегда подгружен как модуль. (ПХП как cgi и костыли к перлу не в счет).
А если как сервер использовать к примеру не апач, а собственный написанный код на асме. Который работает по аналогии с серверами из книги Стивенса "Создание сетевых приложений" То скорость будет, ещё чуточку повыше?
stellaco Будет, само собой производительнее. Я как-то задумывался о написании специализированного веб-сервера под никс платформу. С самым необходимым минимумом функций, чтобы только умел отдавать статику и обязательно поддерживал дополнительные cgi модули в виде динамически подгружаемых библиотек. Никаких скриптов, никаких логов, никаких лишних файловых операций. Тщательно продуманная многопоточность и грамотная реализация на ассемблере - и будет веб-сервер с макимальной производительностью. Но, к сожалению, мешают суровые реалии юникс платформ. Там никто дальше Апача и Си думать не хочет. Несовместимость между версиями. Хотя есть надежда, что если использовать только низкоуровневые вызовы, без взаимодействия с какими-либо библиотеками, то возможно и получится переносимый исполняемый файл. Тут надо уже углубляться в юникс программирование. Как бы помягче выразится, несовершенство существующих средств разработки и отладки приложений под юникс. ИМХО, на асме там практически вобще никто не программирует, отладчиков нормальных нет и т.д. И сейчас я в раздумьях, может ну его нафик, эти юниксовые мучения, разрабатывать под винду, тут тебе и ассемблеры и отладчики и куча наработанного кода и бинарная совместимость. Я вот даже не знаю, есть ли в юниксах аналог виндовых портов завершения...
При таком размере строки может будет выгоднее использовать SIMD возможности процессора? Это всем вопрос. И при каком размере строки уже будет невыгодно использовать SIMD? Вы какую задачу вообще решаете? От этого зависит ответ. Вам нужна бизнес-логика реализованная на ассемблере или свой сервер? Если второе то для начала сделайте просто сервер статики, который просто по запросу отдаёт статичный контенет (картинку например). Затем при помощи AB и нагрузочного тестирования сравните с nginx и lighthttpd (это самые популярные серверы статики, для рунета и зарубежа соответственно). Касательно того что php производит меньше нагрузки чем perl очень спорно! У нас так же может быть и mod_perl и FastCGI тут уже надо конкретные тесты проводить. Я думаю perl будет быстрее и легче. Несколько лет назад слышал что поисковые сервера яндекса работают на C/C++ и Perl. C++ я сам видел, perl не видел. Перл язык которому больше лет чем php. Интерпретатор за это время отшлифован наверное супер отлично. php как раз загибается в производительности на загрузке скрпита, его нужно весь загрузить. подключаешь класс, невооруженным глазом видно что скорость уменьшилась.
Не вижу практического смысла... получившийся продукт будет непереносим на другие платформы и, что самое главное, не сопровождаем, а, значит, бесполезен. Лучше написать работающее приложение на C/С++, а уже потом гонять его на тестах, оптимизируяю "узкие" места. Хотя.... сколько я написал прог, "не имеющих практического смысла", зато прикольных в разработке и давших бесценный опыт.
TheBits Речь про то, что одно дело, когда с каждым запросом происходит создание процесса, другое - когда код всегда наготове, это конечно лучше. scf На какие платформы? Зачем его переносить? И почему он будет не сопровождаем?
TheBits В данный момент я хочу сделать CGI (достаточно объёмное) приложение на ассемблере. Решил, что пора уже сосредоточиться на тех задачах, которыми хотел заниматься этак последние года три. Изначально изучал ассемблер (по собственному желанию) но потом затенил эти знания, всякой ерундой наподобии php sql css....и тд. Сейчас экстренно восстанавливаю свои познания в ассемблере и криптографии. Первоначально хочу полноценное cgi приложение. А затем, буду смотреть, что дальше смогу делать (очень хочу разбираться в устройстве субд). Насчёт simd, эту возможность буду рассматривать чуть позже.Для начала, хотелось бы, чтоб у меня просто заработала проверка введённых данных, в html форме.
На одних сисколах полноценное CGI не построишь! А если тебе нужны будут регулярные выражения? То тоже на асме тебе придется подключать libregexp.so А это - либо через extern, либо через dlopen() (вызов библиотечной ф-ции), но для этого тебе потребуется libdl.so
stellaco В современных камнях все строковые операции rep ... имеют большое время инициализации (оверхед), поэтому их вообще не имеет смысла использовать на коротких строках
Я новичок, в асме, - никогда на нём ничего не программировал. Извените за вопросы, которые могут показаться глупыми.(хотя самый глупый вопрос, это тот, что не был задан) osrootd Раз уж были упомянуты регулярки, то если не трудно покажите, как подключить libregexp.so и использовать регулярные выражения в коде асм leo А чем их заменить то тогда? И мы сильно отошли от темы, моё сообщение Вчера 22:49:13 так и осталось без ответа. Посмотрите пожалуйста код приложения, там всё хорошо расписано. Где ошибка? как исправить?
команда scasb берет байты из строки, на которую указывает edi. А у тебя указатель на строку "login=" пишется в esi.
Чтото я не совсем понял.. Моя задача сейчас найти символ "&"в строке, которая записана в http_login_param_buf Начало сканируемоей строки идёт сразу после "login=" Этот участок кода сравнивает первые 6 символов строки с "login=" Сначала заносим в edi адрес http_login_param_buf Потом сравниваем символы ... указатели edi и esi увеличины на 6.. и указывают на первый символ после этих шести символов login= Код (Text): ;сканирование логина cld ; автоинкремент mov edi, http_login_param_buf ; буфер для всех принятых данных методом POST mov esi, http_login_string ; строка "login=" mov ecx,6 ; сколько первых символов строк нужно сравнить (адресуемые регистрами ESI и EDI) rep cmpsb ; сравниваем две строки, адресуемые регистрами ESI и EDI jnz exit ; проверяем флаг нуля, если не ноль, то строки не совпали и прыгаем на incorrect ; до этого момента проблем нет Потом следует этот код Код (Text): mov al, "&" ; что будем искать mov ecx, 65530 ; записать в счётчик 65530 (размер сканируемой строки) repne scasb ; поиск & в массиве из 65530 байт jnz exit ; переход на метку incorrect , если не нашли так как scasb начинает сканирование с начального адреса в edi (а он уже записан там) , то начинаем просматривать весь логин.... (принятые данные начинающиеся после символов "login="ЛОГИН_ЛОГИН_ЛОГИН) вплоть до разделителя & (Через scasb ищу разделитель "&" ) Разъясните, в чём я не прав....
Ну я не знаю. Все вроде правильно. Может ошибка у тебя в другом месте? Запусти под отладчиком и проверь - действительно ли в edi адрес нужной строки. P. S. Длина строки у тебя слижком длинная. Ты же фактическую длину строки не считаешь? После сравнения с '&' проверяй на равенство с 0x00. Если текущий байт == 0x00, значит мы дошли до конца строки. А так может возникнуть переполнение буфера при чтении (если фактическая длина строки меньше 65530). Но это вряд ли относится к ошибке.