2014-06-25 50 views
0

我想學習如何在程序集中使用linux 64位系統調用。從x64 linux系統調用(組件)讀取鍵盤輸入

我正在寫一些閱讀鍵盤的代碼,只需在屏幕上按下按鍵:我使用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

回答

1
它不退出

它自動在屏幕上打印出鍵

這是Linux中的默認設置(獨立於編程語言E):

  • 鍵盤輸入輸出到屏幕
  • SYS_READ會等到回車(Enter)鍵被按下

要改變這種行爲tcsetattr()函數(在C)必須被調用。您應該先調用tcgetattr()函數來存儲當前設置並在離開程序之前將其恢復。

如果您想直接使用系統調用:tcsetattr和tcgetattr都使用一些sys_ioctl。爲了找出使用哪個ioctl()代碼,你可以編寫一個C程序來做tcsetattr和tcgetattr,並使用「strace」來找出哪些系統調用被調用。

當我按下它不會退出ESC

有三個問題在文件中:

  1. 據我理解你正確讀取兩個字節 - 這意味着兩次擊鍵 - 每當你調用sys_read
  2. sys_read將一直等到返回鍵被按下(見上)
  3. 你比較一個64位的值和一個m只有一個(或兩個)字節長的emory。

您應該只使用sys_read讀取一個字節。那麼你應該做一個比較,按字節,而不是64位比較:中

cmp bl,key 

代替:

cmp rbx,key