【发布时间】:2020-07-22 05:02:30
【问题描述】:
我最近使用 Linux 程序集 (x86_64) 进行输入,我得到了这个代码,我最终尝试了它,代码不像我预期的那样工作,我应该等待击键,但它从任何地方自动输入,我怀疑 termios标志...代码在下面:
;Get current settings
Mov EAX, 16 ; SYS_ioctl
Mov EDI, 0 ; STDIN_FILENO
Mov ESI, 0x5401 ; TCGETS
Mov RDX, termios
Int 80h
And dword [c_cflag], 0xFD ; Clear ICANON to disable canonical mode
; Write termios structure back
Mov EAX, 16 ; SYS_ioctl
Mov EDI, 0 ; STDIN_FILENO
Mov ESI, 0x5402 ; TCSETS
Mov RDX, termios
Int 80h
Mov EAX,0 ;sys_read kernel call
Mov EBX,0 ;stdin trap (standart input)
Mov ECX,Nada ;Masukkan offset/jumlah byte yang akan di baca
Mov EDX,1 ;Jumlah byte yang dibaca
Int 80h ;Call Kernel
对于 termios 结构:
SECTION .bss ;deklarasi untuk variable yang belum terdefinisi
Enter: Resb 1 ;Pesan 1 byte untuk Enter
Nada: Resb 1
termios:
c_iflag Resd 1 ; input mode flags
c_oflag Resd 1 ; output mode flags
c_cflag Resd 1 ; control mode flags
c_lflag Resd 1 ; local mode flags
c_line Resb 1 ; line discipline
c_cc Resb 64 ; control characters
对于输出:
nasm -f elf64 -g -F stabs key.asm
ld -o KeyPress key.o
./KeyPress
Untuk memulai tekan tombol enter:
Tekan tombol untuk memainkan satu not: (1,2,3,4,5,6,7,8)
//this part are the error occur,i have to check if user inputed right value
if not it will jump to error label and printed below message//
Error note not found please contact the app developer !!
参考:Linux Getch(), My Github Repo
PS:对于我已经推送到我的存储库的最新代码,我使用 ubuntu 20.04 和 Intel i7(64 位),感谢您的帮助
【问题讨论】:
-
What happens if you use the 32-bit int 0x80 Linux ABI in 64-bit code? - 您不能将 64 位地址与
int 0x80一起使用。只是根本不要在 64 位代码中使用它,但这会使Mov RDX, termios与EDX相比毫无意义
标签: linux assembly x86-64 nasm system-calls