在汇编程序中从 /dev/input/event* 读取键盘事件

Reading keyboard events from /dev/input/event* in assembler

问题是直接从设备读取(不能从标准输入读取)。这是用 C 语言实现的一项非常简单的任务。但是我找不到在汇编程序中做同样事情的方法。活动布局为:

struct input_event {
    struct timeval time;
    unsigned short type;
    unsigned short code;
    unsigned int value;
};

所以,我已经试过了:

.section .data
file:
    .asciz "/dev/input/event0"

# event structure
event:
time:
    .octa 0
type:
    .short 0
code:
    .short 0
value:
    .int 0

.section .text
    .globl _start

_start:
    # open /dev/input/event0 for reading
    movl , %rax               # sys_open
    movl $file, %rbx            # put path in rbx
    movl [=12=], %rcx              # readonly flag
    movl 020, %rdx           # open mode
    syscall                   
    movl %rax, %rsp             # put file descriptor on stack
...

因此,sys_open-14 置于 %rax、"Bad address" 错误中。从 /dev/input/event* 读取有什么问题(当然有 root 权限)? 这样做的正确方法是什么?以我将要执行的方式读取结构是否可以(在标签 "event" 处的字节串中)?

甚至不应该 assemble,请不要使用冲突的大小后缀...movl 对于 64 位操作没有任何意义,即使您很幸运 assembler 接受它(我的不接受,这是正确的)。另外,您的问题不在于阅读事件。您甚至无法打开该文件,因此您应该将问题集中在该文件上。它不起作用的原因是 open 的函数编号是 25 表示 fstat。此外,参数应放在 rsirdirdx 中(但请注意,如果您不要求 [=20],则不必传递 mode =]):

movl , %eax              # sys_open
movabsq $file, %rdi        # path
movl [=10=], %esi             # readonly flag
syscall

movl %rax, %rsp 也是一个坏主意,您可能想要其他类似 movq %rax, -8(%rsp) 或任何合适的东西。

PS:至少在我的系统上你需要root权限才能打开/dev/input/event0