问题是直接从设备读取(无法从标准读取)。在 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 $5, %rax # sys_open
movl $file, %rbx # put path in rbx
movl $00, %rcx # readonly flag
movl $04020, %rdx # open mode
syscall
movl %rax, %rsp # put file descriptor on stack
...
因此,sys_open
-14
置于%rax
,"错误地址"错误。从/dev/input/event*
中读取有什么问题(当然有根特权)?正确的方法是什么?是否可以按照我将要的方式读取结构(在标签"事件"处以一堆字节为单位)?
这甚至不应该组装,请不要使用冲突的大小后缀...... movl
64 位操作是没有意义的,即使您很幸运汇编程序接受它(我的没有,这是正确的)。此外,您的问题不在于阅读事件。您甚至无法打开文件,因此您应该将问题集中在此。它不起作用的原因是open
的函数数是2
,5
表示fstat
。此外,参数应放在 rsi
、 rdi
和 rdx
中(但请注意,如果您不要求O_CREAT
,则不必传递mode
):
movl $2, %eax # sys_open
movabsq $file, %rdi # path
movl $00, %esi # readonly flag
syscall
movl %rax, %rsp
也是一个坏主意,你可能想要其他东西,比如movq %rax, -8(%rsp)
或任何合适的东西。
PS:至少在我的系统上,您需要root权限才能打开/dev/input/event0
。