Почему не выполняется системный вызов read ?

Тема в разделе "WASM.BEGINNERS", создана пользователем stellaco, 10 янв 2009.

  1. stellaco

    stellaco New Member

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


    Последний вызов ;Системный вызов #3 read: пропускается ( и не выполняется.....завершается...(без ошибок)...


    Программа должна сначала, вывести определённые данные, затем пользователь должен ввести какето данные, затем прога снова выводит данные....и потом снова должен быть ввод пользователя..но он, почемуто ...по непонятной мне причине..не выполняется...а просто игнорируется......
    что делать?
     
  2. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    "Учиться, учиться, и учиться...товалищи, и пиво - нивкоем случае..."
    из речи тов. В.И.Ленина на 1-м всесоюзном съезде програмистов
     
  3. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Blackbeam
    так в чём проблема??
     
  4. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    проблема - у тебя, перед тем как писать "вот код", напиши - на каком языке ты пишишь, в какой среде, чем копилируишь

    я знаю ( как-бы) только масм, и с точки зрения масма твой "код" смахивает на шизоидальный бред, хотя, может быть "правильный" ассемблер и должен быть таким ...
     
  5. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    Blackbeam
    код под linux на nasm'е. Имхо это очевидно из-за int 0x80 и syscall'ов.

    stellaco
    код верен, не знаю почему у тебя не работает. Посмотри в отладчике и приведи полный код.
     
  6. SadKo

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

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    А права на чтение есть?
     
  7. SadKo

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

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Сорри, не обратил внимание, что имеем дело с stdin.
     
  8. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    meduza
    Весь код не могу выложить..он слишком большой...
    Но ошибка именно тут, точнее даже не ошибка.......а не пойми что =) не ясность какая-то...
    через gdb я могу просмотреть только до определённого сравнения..
    вот оно
    cmp byte[accepted_buf], 'y'
    je label_accepted
    cmp byte[accepted_buf], 'Y'
    je label_accepted
    jmp exit ;если пользователь ввёл что-то отличное от символов 'y' 'Y' то выходим

    label_accepted:
    далее идёт код, который написан в самом начале темы)...
    gdb доходит до jmp exit и дальше...всё.....end_dump........
     
  9. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    SadKo
    Ничего страшного)..
    любая инициатива приветствуется =)
     
  10. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    stellaco
    Код, который ты привел в посте #1 верен! Если у тебя возникает какая-то ошибка, то она возникает за пределами этого кода.
    залей на файлообменник, хотя бы 1 файл, тот который глючит
     
  11. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    stellaco
    И во избежание недоразумений как с Blackbeam, а также чтобы другим бегиннерсам было проще искать пости пожалуйста вопросы по никсам в разделе WASM.UNIX
     
  12. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Y_Mur ок.
    но из того раздела меня посылали в этот =)
    Да и там темы не особо смотрят... моя тема про cgi там уже недели три, а ответов..целых два. (проблема осталась открытой).. А в этом разделе, мне реально помогли)..указали на ошибку.

    meduza
    Вот код, я удалил всё лишнее.
    Проблема осталась =)

     
  13. booler

    booler New Member

    Публикаций:
    0
    Регистрация:
    7 янв 2009
    Сообщения:
    1
    ну надо наверно все же посмареть после этого куска кода в eax код ошибки или, если eax положительно, кол-во прочитаных символов(этот случай будет действительно странным)
    и еще попробуй предыдущий вызов read убери. возможно в буфере чтения остались символы после него. в визуал студии приходилось fflush() вызывать постоянно из-за этого :)
     
  14. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    booler
    Я думал что при системных вызовах в буфер ничего не записывается =)... кажется это особенность СИ, делать буферизацию ...
    А так верно, нужно после второго read проверить EAX...
    как буду в linex сразу проверю..

    И ещё, я запускаю программы через bash ..и подумываю.... может терминал что-то мудрит?.. хотя пробовал прогу запускать и через xterm... результат был тотже (
     
  15. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Хех, забавно ..
    раньше всегда компилировал) так..
    nasm -f elf file
    ld file.o
    ./a.out (запуск)..
    и прога заступоривалась на втором вызове read...
    а тут ... решил откомпилировать так))))
    nasm -f elf file | ld file.o | ./a.out (для запуска нового файла..нужно эту стоку два раза вбить... видимо терминал сразу последовательно выполняет эти команды, а программа ещё не успевает скомпилироваться.......но на второй ввод¸программа всегда запускается новенькая..)
    Ну вобщем ближе к делу...
    Теперь программа не доходит и до первого вызова read
    Видимо проблема в передаче данных терминалом =)..
    (теперь расмотрим запуск проги вот так ./a.out)
    Теперь обратим внимание на первый вызов read
    Там нужно ввести "y" или "Y" ...Появляется запрос на ввод ..вводим.. Y или y и жмём Enter...и чтож это такое получается??? терминал что?? шлёт первый символ в первой сис вызов read а во второй...Enter? (0x0A)..
    Забавно =) щас кстати это проверю....
     
  16. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    stellaco
    Не вижу смысла в этом, "a | b" передает stdout "a" в stdin "b". В твоем случае это бессмысленно. Если хочешь за раз скомпилить, слинкить и запустить, то замени '|' на '&&'.
    Да, скорее всего в этом проблема. Замени на "mov edx,2" (а лучше еще больше, для "защиты от дурака") в первом read.
     
  17. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    meduza
    Спасибо за поправку по консоли .
    И спасиб за mov edx, 2
    Проблема решена.