При запуске asm - cgi приложения, сервером..... (вопрос)

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

  1. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    При запуске asm - cgi приложения, сервером происходит следующее.....
    При заполнении html формы на одной странице, и отправки введённых данных (для проверки) другой странице. Вторая страница выводит не полученные данные (которые помещаются в некий буфер, а потом из него выводятся на экран) а следующее.
    1) Отрабатывает системный вызов вывода html заголовка (это самое первое действие в программе)
    2) отрабатывает (самый последний вызов в коде)вывода закрывающихся тегов.
    3) Потом последовательно , сверху вниз..выводятся все данные из секции date (хотя, об этом никто никого не просил, и в тестовом коде, где всё это я пробовал.... с этими данными ничего не делается.)
    4)Выводятся те данные, которые должны были вывестись в самом начале ))) (кстати, для записи в принятых данных в бефер, используется системный вызов read)

    (Все данные и их размеры у меня находятся в секции .date
    в секции bss находится буфер для переданных данных из html форм )

    Структура программы выглядит примерно так.
    объявлены данные в bss
    объявлены данные в date
    старт
    выводится html заголовок (через syscall write)
    выводятся полученные данные переданные этой странице из html формы(другой страницы =) )
    выводится закрывающие теги (через syscall write)
    выход из программы.


    Программа исполнятся на сервере Apache .


    Кто знает?? с чем связано такое поведение программы? и как это лечится???
     
  2. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    никто не знает???
     
  3. K10

    K10 New Member

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

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Там была статья про cgi на асме под windows . А я программирую под *nix

    И у меня вопрос про конкретный случай. (вывода данных в бразуер) а не о том)) как вывести данные в браузер)
     
  5. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Значит у тебя косяк в коде. Бери отладчик и разбирайся.
     
  6. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    K10
    Косяка не должно быть, так как весь код, проверял по частям.. (записывал выводимые данные в файл..).. но всёравно проверю. (это я про маленькую функцию в 410 строк... и потому допускаю возможность ошибки..)
    ...но я даже пробовал делать файл с минимум функций...просто приём..и вывод данных..и всёравно тажа хрень
     
  7. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Вот тестовый код

    Код (Text):
    1. section .bss
    2. http_registration_param_buf resb 224 ; зарезервировать под принятые параметры POST
    3.  
    4. section .date
    5. http_header db "Content-Type: text/html", 0x0A, 0x0A
    6.  
    7. db "<html><head><meta content='text/html; charset=UTF-8' http-equiv=Content-Type><title>Регистрация</title><body>"
    8. http_end db "</body></head></html>", 0x0A
    9.  
    10. registration_error db "<error>Введены не корректные данные.", 0x0A
    11.                    db "В регистрации отказано.</error>"
    12. reg_accepted_error db "<error>Вы должны быть ознакомлены и согласны с Соглашением о предоставлении услуг.</error>"
    13.  
    14. http_header_lenght equ $-http_header ; длинна http_header в байтах
    15. http_end_lenght equ $-http_end ; длинна http_end в байтах
    16.  
    17.  
    18. global _start
    19. _start:
    20.  
    21. ;Системный вызов #3 read:
    22. mov eax, 3 ; syscall read
    23. mov ebx, 0 ; STD_IN
    24. mov ecx, http_registration_param_buf ; адрес буфера для приёма параметров
    25. mov edx, 224 ; длинна записываемых данных в байтах
    26. int 0x80 ; Обратится к ядру для возбуждения системного вызова
    27. ;Записали принятые данные в http_registration_param_buf
    28.  
    29. ;Выводим html заголовок
    30. ;Системный вызов #4 write:
    31. mov eax, 4 ; syscall write
    32. mov ebx, 1 ; STD_OUT
    33. mov ecx, http_header ; адрес строки
    34. mov edx, http_header_lenght ; длинна http заголовка в байтах
    35. int 0x80 ; Обратится к ядру для возбуждения системного вызова
    36. ;Вывели html заголовок
    37.  
    38. ;Системный вызов #4 write:
    39. mov eax, 4 ; syscall write
    40. mov ebx, 1 ; STD_OUT
    41. mov ecx, http_registration_param_buf ; адрес строки
    42. mov edx, 224 ; длинна выводимых данных
    43. int 0x80 ; Обратится к ядру для возбуждения системного вызова
    44.  
    45. ;Выводим закрывающие теги html
    46. ;Системный вызов #4 write:
    47. mov eax, 4 ; syscall write
    48. mov ebx, 1 ; STD_OUT
    49. mov ecx, http_end ; адрес строки
    50. mov edx, http_end_lenght ; длинна конца http_end в байтах
    51. int 0x80 ; Обратится к ядру для возбуждения системного вызова
    52.  
    53. ;Системный вызов #1 exit:
    54. mov eax, 1 ; syscall exit
    55. xor ebx,ebx ; поместить 0 в ebx
    56. 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 так здорова оптимизировал код? или ещё что...

    Есть какие-то мысли?
     
  8. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    fflush stdout делал?
     
  9. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    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>)...
     
  10. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Ну же.. есть у кого какие соображения???
     
  11. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    stellaco

    похоже у тебя длина буферов в переменных http_header_lenght и http_end_lenght неверна. проверь.
     
  12. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    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 в байтах


    Вроде тут нету ошибки.
     
  13. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Как вызвать СИ функцию fflush из ассемблера?
     
  14. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    irrona
    Ты был(а) прав(а) .. =)
    Спасибо!!!!!