Обработка клавиши

Тема в разделе "WASM.BEGINNERS", создана пользователем Pamidor, 4 фев 2009.

  1. Pamidor

    Pamidor New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2009
    Сообщения:
    3
    Здравствуйте!
    Недавно начал изучать FASM (под Linux), в этом деле совсем нуб, написал примитивнейшую программу выхода по нажатии клавиши:
    Код (Text):
    1. format ELF executable
    2. start:
    3. mov eax,4
    4. mov ebx,1
    5. mov ecx,msg
    6. mov edx,msgsz
    7. int 80h
    8. mov eax,3
    9. int 80h
    10. cmp eax,32
    11. jne start
    12. mov eax,1
    13. int 80h
    14. msg db 'Press space to exit',0Ah
    15. msgsz=$-msg
    и вот эта самая операция не выполняется. При нажатии любой клавиши ничего не происходит: приходится ещё и нажимать Enter для ввода. После нажатия энтера выкидывает опять на метку start и из программы никак, кроме грубого прерывания не выйти. Ещё и строки "обрываются". Ткните носом пожалуйста!
     
  2. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    Ну, во-первых, syscall # 3 считывает не нажатие одной клавиши, а считывание строки.
    Во-вторых, этот syscall принимает 3 параметра, а не один: read(fd, buf, numbytes);
    В-третьих, в регистр EAX заносится не код считавшегося символа, а количество считавшихся байт.
    Поэтому у тебя ничего не работает.
    Прога должна выглядеть примерно так:

    format ELF executable
    start:
    mov eax,4
    mov ebx,1
    mov ecx,msg
    mov edx,msgsz
    int 80h
    mov eax,3 ------ Номер Сисколла
    mov ebx,0 ----- Указываем, откуда считывать символы. В данном случае - stdin
    mov ecx, buf ------ Адрес буфера, куда запишем считанную строку
    mov edx,1 ------ Будем считывать только один байт
    int 80h ------- вызываем syscall
    cmp byte[buf], 32 ------считанный символ является пробелом?
    jne start
    mov eax,1
    int 80h
    msg db 'Press space to exit',0Ah
    msgsz=$-msg
    buf db 'a'

    Тут после пробела всё-равно прийдется нажимать Enter. Хочешь чтоб было без энтера - юзай библиотечные функции, а не сисколлы.

    А строки у тебя обрывались потому, что перед вызовом 3его сисколла у тебя регистр ECX указывал на буфер msg, вот туда и записывались два байта: пробел и символ завершения строки.