我正在尝试学习如何在汇编中使用 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 时它不退出
最佳答案
it automatically prints on screen the keys
这是 Linux 中的默认设置(独立于编程语言):
- 键盘输入打印到屏幕
- sys_read 将等待,直到按下返回(回车)键
要更改此行为,必须调用 tcsetattr() 函数(在 C 中)。您应该先调用 tcgetattr() 函数来存储当前设置并在离开程序之前恢复它们。
如果你想直接使用系统调用:tcsetattr 和 tcgetattr 都使用一些 sys_ioctl。要找出使用了哪个 ioctl() 代码,您可以编写一个执行 tcsetattr 和 tcgetattr 的 C 程序,并使用“strace”找出调用了哪些系统调用。
it doesn't exit when i press esc
文件中存在三个问题:
- 据我所知,每当您调用 sys_read 时,您都会读取两个字节 - 这意味着两次击键
- sys_read 将等待直到按下返回键(见上文)
- 将一个 64 位值与一 block 只有一个(或两个)字节长的内存进行比较。
您应该使用 sys_read 只读取一个字节。那么您应该进行按字节比较而不是 64 位比较:
cmp bl,key
代替:
cmp rbx,key
关于linux - 使用 x64 linux 系统调用(汇编)从键盘读取输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24419077/