在汇编程序中从 /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
的函数编号是 2
,5
表示 fstat
。此外,参数应放在 rsi
、rdi
和 rdx
中(但请注意,如果您不要求 [=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
。
问题是直接从设备读取(不能从标准输入读取)。这是用 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
的函数编号是 2
,5
表示 fstat
。此外,参数应放在 rsi
、rdi
和 rdx
中(但请注意,如果您不要求 [=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
。