Здравствуйте! Недавно начал изучать FASM (под Linux), в этом деле совсем нуб, написал примитивнейшую программу выхода по нажатии клавиши: Код (Text): format ELF executable start: mov eax,4 mov ebx,1 mov ecx,msg mov edx,msgsz int 80h mov eax,3 int 80h cmp eax,32 jne start mov eax,1 int 80h msg db 'Press space to exit',0Ah msgsz=$-msg и вот эта самая операция не выполняется. При нажатии любой клавиши ничего не происходит: приходится ещё и нажимать Enter для ввода. После нажатия энтера выкидывает опять на метку start и из программы никак, кроме грубого прерывания не выйти. Ещё и строки "обрываются". Ткните носом пожалуйста!
Ну, во-первых, 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, вот туда и записывались два байта: пробел и символ завершения строки.