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

时间:2016-03-08 14:21:46

标签: linux assembly linux-kernel keyboard-events gas

问题是直接从设备读取(无法从stdin读取)。在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*读取的问题是什么(当然还有root权限)? 这样做的正确方法是什么?是否可以按照我要做的方式读取结构(在标签“event”中的字节串中)?

1 个答案:

答案 0 :(得分:2)

那甚至不应该组装,请不要使用冲突的大小后缀...... movl 64位操作没有任何意义,即使你很幸运,汇编程序接受它(我的没有,这是正确的)。您的问题也不在于阅读事件。你甚至无法打开文件,所以你应该把注意力集中在那里。它不起作用的原因是open的函数编号为25表示fstat。此外,参数应放在rsirdirdx中(但请注意,如果您不要求{{1},则不必传递mode }}):

O_CREAT

movl $2, %eax # sys_open movabsq $file, %rdi # path movl $00, %esi # readonly flag syscall 也是一个坏主意,你可能想要其他类似movl %rax, %rsp或其他合适的东西。

PS:至少在我的系统上,您需要root权限才能打开movq %rax, -8(%rsp)