При запуске asm - cgi приложения, сервером происходит следующее..... При заполнении html формы на одной странице, и отправки введённых данных (для проверки) другой странице. Вторая страница выводит не полученные данные (которые помещаются в некий буфер, а потом из него выводятся на экран) а следующее. 1) Отрабатывает системный вызов вывода html заголовка (это самое первое действие в программе) 2) отрабатывает (самый последний вызов в коде)вывода закрывающихся тегов. 3) Потом последовательно , сверху вниз..выводятся все данные из секции date (хотя, об этом никто никого не просил, и в тестовом коде, где всё это я пробовал.... с этими данными ничего не делается.) 4)Выводятся те данные, которые должны были вывестись в самом начале ))) (кстати, для записи в принятых данных в бефер, используется системный вызов read) (Все данные и их размеры у меня находятся в секции .date в секции bss находится буфер для переданных данных из html форм ) Структура программы выглядит примерно так. объявлены данные в bss объявлены данные в date старт выводится html заголовок (через syscall write) выводятся полученные данные переданные этой странице из html формы(другой страницы =) ) выводится закрывающие теги (через syscall write) выход из программы. Программа исполнятся на сервере Apache . Кто знает?? с чем связано такое поведение программы? и как это лечится???
Там была статья про cgi на асме под windows . А я программирую под *nix И у меня вопрос про конкретный случай. (вывода данных в бразуер) а не о том)) как вывести данные в браузер)
K10 Косяка не должно быть, так как весь код, проверял по частям.. (записывал выводимые данные в файл..).. но всёравно проверю. (это я про маленькую функцию в 410 строк... и потому допускаю возможность ошибки..) ...но я даже пробовал делать файл с минимум функций...просто приём..и вывод данных..и всёравно тажа хрень
Вот тестовый код Код (Text): section .bss http_registration_param_buf resb 224 ; зарезервировать под принятые параметры POST section .date http_header db "Content-Type: text/html", 0x0A, 0x0A db "<html><head><meta content='text/html; charset=UTF-8' http-equiv=Content-Type><title>Регистрация</title><body>" http_end db "</body></head></html>", 0x0A registration_error db "<error>Введены не корректные данные.", 0x0A db "В регистрации отказано.</error>" reg_accepted_error db "<error>Вы должны быть ознакомлены и согласны с Соглашением о предоставлении услуг.</error>" http_header_lenght equ $-http_header ; длинна http_header в байтах http_end_lenght equ $-http_end ; длинна http_end в байтах global _start _start: ;Системный вызов #3 read: mov eax, 3 ; syscall read mov ebx, 0 ; STD_IN mov ecx, http_registration_param_buf ; адрес буфера для приёма параметров mov edx, 224 ; длинна записываемых данных в байтах int 0x80 ; Обратится к ядру для возбуждения системного вызова ;Записали принятые данные в http_registration_param_buf ;Выводим html заголовок ;Системный вызов #4 write: mov eax, 4 ; syscall write mov ebx, 1 ; STD_OUT mov ecx, http_header ; адрес строки mov edx, http_header_lenght ; длинна http заголовка в байтах int 0x80 ; Обратится к ядру для возбуждения системного вызова ;Вывели html заголовок ;Системный вызов #4 write: mov eax, 4 ; syscall write mov ebx, 1 ; STD_OUT mov ecx, http_registration_param_buf ; адрес строки mov edx, 224 ; длинна выводимых данных int 0x80 ; Обратится к ядру для возбуждения системного вызова ;Выводим закрывающие теги html ;Системный вызов #4 write: mov eax, 4 ; syscall write mov ebx, 1 ; STD_OUT mov ecx, http_end ; адрес строки mov edx, http_end_lenght ; длинна конца http_end в байтах int 0x80 ; Обратится к ядру для возбуждения системного вызова ;Системный вызов #1 exit: mov eax, 1 ; syscall exit xor ebx,ebx ; поместить 0 в ebx int 0x80 ; Обратится к ядру для возбуждения системного вызова Код максимально упрощён!... При запуске этого файла в консеоле.. выводится следующее [stellaco@localhost отладка]$ ./a.out login=stellaco&password=56665444 (это то что мы передаём программе..в функцию read) Content-Type: text/html (с этой строки начался вывод программы) <html><head><meta content='text/html; charset=UTF-8' http-equiv=Content-Type><title>Регистрация</title><body></body></head></html> <error>Введены не корректные данные. В регистрации отказано.</error><error>Вы должны быть ознакомлены и согласны с Соглашением о предоставлении услуг.</error>login=stellaco&password=56665444 </body></head></html> <error>Введены не корректные данные. В регистрации отказано.</error><error>Вы должны быть ознакомлены и согласны с Соглашением о предоставлении услуг.</error>[stellaco@localhost отладка]$ (а вот тут, вывод программы завершился) Вот сижу и думаю) чем охарактеризовано такое повидение программы?.. nasm так здорова оптимизировал код? или ещё что... Есть какие-то мысли?
SadKo fflush stdout не делал... (не знаю как...) (если знаете как осуществить сброс буферов на асме(в *nix), то пожалуйста подскажите, как это сделать ) Возможно в этом проблема. Хотя есть момент, который смущает... это в выводе программы <html><head><meta content='text/html; charset=UTF-8' http-equiv=Content-Type><title>Регистрация</title><body></body></head></html> (эти три закрывающихся тега должны были вывестись, после того как будет выведено login=stellaco&password=56665444 ) <error>Введены не корректные данные. В регистрации отказано.</error><error>Вы должны быть ознакомлены и согласны с Соглашением о предоставлении услуг.</error>login=stellaco&password=56665444 </body></head></html> Не понятно почему последний системный вызов в программе , происходит сразуже после первого.(выводятся закрывающие теги </body></head></html>) и почему выводятся данные из секции date если их никто в коде не выводил (они находятся между тегами <error>)...
stellaco похоже у тебя длина буферов в переменных http_header_lenght и http_end_lenght неверна. проверь.
irrona http_header db "Content-Type: text/html", 0x0A, 0x0A db "<html><head><meta content='text/html; charset=UTF-8' http-equiv=Content-Type><title>Регистрация</title><body>" http_end db "</body></head></html>", 0x0A http_header_lenght equ $-http_header ; длинна http_header в байтах http_end_lenght equ $-http_end ; длинна http_end в байтах Вроде тут нету ошибки.