【问题标题】:Reading input from keyboard with x64 linux syscalls (assembly)使用 x64 linux 系统调用(程序集)从键盘读取输入
【发布时间】:2014-06-26 12:56:24
【问题描述】:

我正在尝试学习如何在汇编中使用 linux 64 位系统调用。

我正在编写一些用于读取键盘的代码,并简单地将其打印在屏幕上按下的键:我正在使用 sys_read。

代码:

section .text

global _start

_start:
;write startmsg
mov rax, 1
mov rdi, 1
mov rsi, startmsg
mov rdx, sizestart
syscall
;using sys_read
mov ax, 0
mov rdi, 0
mov rsi, key
mov rdx, 2
syscall
;trying to see if esc is pressed then exit
mov rbx, 0x1b
cmp rbx, key
je _exit

_exit:  
mov rax, 60
mov rdi, 0
syscall

section .bss
key resw 1

section .data
startmsg db 'Press a key', 10
sizestart equ $-startmsg

现在发生了两件事: 1) 它会自动在屏幕上打印按键 (D:) 2)当我按esc时它不会退出

【问题讨论】:

    标签: linux assembly system-calls


    【解决方案1】:

    它会自动在屏幕上打印按键

    这是 Linux 中的默认设置(与编程语言无关):

    • 键盘输入打印到屏幕上
    • sys_read 将等到按下返回(回车)键

    要改变这种行为,必须调用 tcsetattr() 函数(在 C 中)。您应该在离开程序之前调用 tcgetattr() 函数来存储当前设置并恢复它们。

    如果你想直接使用系统调用:tcsetattr 和 tcgetattr 都使用一些 sys_ioctl。要找出使用了哪个 ioctl() 代码,您可以编写一个执行 tcsetattr 和 tcgetattr 的 C 程序,并使用“strace”找出调用了哪些系统调用。

    当我按下 esc 时它不会退出

    文件存在三个问题:

    1. 据我正确理解,当您调用 sys_read 时,您会读取两个字节 - 这意味着两次击键
    2. sys_read 将等到按下返回键(见上文)
    3. 您将 64 位值与只有一个(或两个)字节长的内存进行比较。

    您应该使用 sys_read 只读取一个字节。然后你应该做一个字节比较而不是一个 64 位比较:

    cmp bl,key
    

    代替:

    cmp rbx,key
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 2016-08-10
      相关资源
      最近更新 更多