使用x64 linux系统调用从键盘读取输入(程序集)

使用x64 linux系统调用从键盘读取输入(程序集),linux,assembly,system-calls,Linux,Assembly,System Calls,我正在尝试学习如何在汇编中使用linux 64位系统调用 我写了一些代码来读取键盘,然后简单地用按下的键将其打印在屏幕上:我使用的是sys_read 守则: section .text global _start _start: ;write startmsg mov rax, 1 mov rdi, 1 mov rsi, startmsg mov rdx, sizestart syscall ;using sys_read mov ax, 0 mov rdi, 0 mov rsi, key

我正在尝试学习如何在汇编中使用linux 64位系统调用

我写了一些代码来读取键盘,然后简单地用按下的键将其打印在屏幕上:我使用的是sys_read

守则:

section .text

global _start

_start:
;write startmsg
mov rax, 1
mov rdi, 1
mov rsi, startmsg
mov rdx, sizestart
syscall
;using sys_read
mov ax, 0
mov rdi, 0
mov rsi, key
mov rdx, 2
syscall
;trying to see if esc is pressed then exit
mov rbx, 0x1b
cmp rbx, key
je _exit

_exit:  
mov rax, 60
mov rdi, 0
syscall

section .bss
key resw 1

section .data
startmsg db 'Press a key', 10
sizestart equ $-startmsg
现在发生了两件事: 1) 它会自动在屏幕上打印按键(D:) 2) 当我按esc键时,它不会退出

它会自动在屏幕上打印按键

这是Linux中的默认设置(独立于编程语言):

  • 键盘输入被打印到屏幕上
  • 系统读取将等待,直到按下返回(回车)键
要更改此行为,必须调用tcsetar()函数(在C中)。您应该在退出程序之前调用tcgetattr()函数来存储当前设置并恢复它们

如果您想直接使用系统调用:tcsetattr和tcgetattr都使用一些sys\u ioctl。要找出使用了哪个ioctl()代码,您可以编写一个C程序,执行tcsetattr和tcgetattr,并使用“strace”找出调用了哪些系统调用

当我按esc键时,它不会退出

文件中有三个问题:

  • 据我所知,无论何时调用sys_read,您都会读取两个字节,这意味着两次击键
  • sys_read将等待返回键按下(见上文)
  • 将64位值与只有一个(或两个)字节长的内存进行比较
  • 您应该使用sys\u read只读取一个字节。然后,您应该执行字节比较,而不是64位比较:

    cmp bl,key
    
    而不是:

    cmp rbx,key