Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 从汇编程序中的/dev/input/event*读取键盘事件_Linux_Assembly_Linux Kernel_Keyboard Events_Gnu Assembler - Fatal编程技术网

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

Linux 从汇编程序中的/dev/input/event*读取键盘事件,linux,assembly,linux-kernel,keyboard-events,gnu-assembler,Linux,Assembly,Linux Kernel,Keyboard Events,Gnu Assembler,问题是直接从设备中读取(无法从标准输入读取)。这是一个用C实现的相当简单的任务。但我找不到一种在汇编程序中实现同样任务的方法。活动布局为: struct input_event { struct timeval time; unsigned short type; unsigned short code; unsigned int value; }; 所以,我试过这个: .section .data file: .asciz "/dev/input/ev

问题是直接从设备中读取(无法从标准输入读取)。这是一个用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\u open
-14
放入
%rax
,“坏地址”错误。从
/dev/input/event*
(当然是根权限)读取有什么问题?
这样做的正确方法是什么?以我将要做的方式(在标签“事件”处以一堆字节)读取结构可以吗?

甚至不应该进行汇编,请不要使用冲突的大小后缀
movl
对于64位操作来说毫无意义,即使你很幸运,汇编程序接受了它(我的不接受,这是正确的)。另外,你的问题不在于阅读事件。你甚至不能打开这个文件,所以你应该把你的问题集中在这个上面。它不起作用的原因是
open
的函数号是
2
5
表示
fstat
。此外,参数应放在
rsi
rdi
rdx
(但请注意,如果您不要求
O_create
,则不必传递
模式
):

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


PS:至少在我的系统上,您需要root权限才能打开不应该组装的
/dev/input/event0

,请不要使用冲突的大小后缀
movl
对于64位操作来说毫无意义,即使你很幸运,汇编程序接受了它(我的不接受,这是正确的)。另外,你的问题不在于阅读事件。你甚至不能打开这个文件,所以你应该把你的问题集中在这个上面。它不起作用的原因是
open
的函数号是
2
5
表示
fstat
。此外,参数应放在
rsi
rdi
rdx
(但请注意,如果您不要求
O_create
,则不必传递
模式
):

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


PS:至少在我的系统中,你需要root权限来打开<代码> /DEV/NoD/Eng0。

你是否考虑使用原始键盘/规范模式,或者这对你的方法还不够吗?@ IcBype不确定如果我得到了你,但我认为<代码> /DEV/输入/事件*>代码>在原始模式中获取数据,不是吗?我不是一个经验丰富的Linux用户,所以我从谷歌和一些书中收集了这种从键盘上阅读的方式。好的,规范模式/原始键盘操纵termio结构,这肯定涉及到stdin。所以我认为这不是正确的方法。如果你仍然感兴趣,我可以在这里寻找我的一个老答案。你是否考虑过使用原始键盘/标准模式,或者这对你的方法还不够吗?@ IcBype不确定如果我得到了你,但是我认为<代码> /DEV/输入/事件*/Cuff>在原始模式中获取数据,不是吗?我不是一个经验丰富的Linux用户,所以我从谷歌和一些书中收集了这种从键盘上阅读的方式。好的,规范模式/原始键盘操纵termio结构,这肯定涉及到stdin。所以我认为这不是正确的方法。如果你仍然感兴趣,我可以在这里找到我的一个老答案。哦,当然我使用的是
movq
。谢谢你的回答!哎呀,我当然在用
movq
。谢谢你的回答!
movl $2, %eax              # sys_open
movabsq $file, %rdi        # path
movl $00, %esi             # readonly flag
syscall