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
Assembly 如何通过汇编代码禁用键盘和鼠标_Assembly_Keyboard_Mouse_Dos_Interrupt - Fatal编程技术网

Assembly 如何通过汇编代码禁用键盘和鼠标

Assembly 如何通过汇编代码禁用键盘和鼠标,assembly,keyboard,mouse,dos,interrupt,Assembly,Keyboard,Mouse,Dos,Interrupt,我试着写一个汇编代码来挂起键盘和鼠标,现在我试着用键盘。我几乎在参考文献和文章中到处搜索,这里的旧主题也几乎都显示了相同的代码,获取INT 9的地址并创建新的中断,然后使其被调用,而不是原始中断9。这就是我写的代码: .model tiny .stack 100h .data old_ISR dd ? .code main proc far mov ah,35h ; get interrupt vector mov al,09

我试着写一个汇编代码来挂起键盘和鼠标,现在我试着用键盘。我几乎在参考文献和文章中到处搜索,这里的旧主题也几乎都显示了相同的代码,获取INT 9的地址并创建新的中断,然后使其被调用,而不是原始中断9。这就是我写的代码:

.model tiny    
.stack 100h
.data
    old_ISR dd ?
.code
main proc far
    mov ah,35h                ; get interrupt vector
    mov al,09                 ; for int 9  
    INT 21h  
    mov word ptr old_ISR,BX   ; address of original int9 saved  
    mov word ptr old_ISR,ES   ; in ES:BX
    mov ah,25h                ; set interrupt vector
    mov al,09h                ; for int 9
    mov DX,offset ISR         ;is pointing to my ISR
    INT 21h 

    mov ax,3100h       ; to make my program resident 
    mov dx,1           ; in the memory
    int 21h


ISR proc  
    push ax
    nop      ; do nothing
    pop  ax
    iret
ISR endp    
在ISR中,我什么都不做,因为我的主要目标是使原始int9不指向包含int9的中断向量表,而是指向我的ISR,那么扫描码将丢失,这就是我想要的。。。。不幸的是,对于我来说,代码根本不能很好地工作,我不知道为什么! 谢谢你的建议

****************一些修改********************

.model tiny    
.stack 100h
.data
    old_ISR dd ?
.code
main proc far
    mov ax;@data  ;new modification
    mov ds,ax     ;new modification

    mov ah,35h                ; get interrupt vector
    mov al,09                 ; for int 9  
    INT 21h  
    mov word ptr old_ISR,BX   ; address of original int9 saved  
    mov word ptr old_ISR,ES   ; in ES:BX
    mov ah,25h                ; set interrupt vector
    mov al,09h                ; for int 9
    mov DX,offset ISR         ;is pointing to my ISR
    INT 21h 

    mov ax,3100h       ; to make my program resident 
    mov dx,1           ; in the memory
    int 21h
main endp  ; new modification

ISR proc  
    push ax
    nop      ; do nothing
    pop  ax
    iret
ISR endp
end          ; new modification
对于MSDO/DOSBOX:

cli
mov al,2     ; disable IRQ 1
out 21h,al
sti

;------------- Main loop
P1:

in   al, 64h  ; get status
test al, 1
jz short NOKEY
test al, 20h  ; byte from PS2 mouse?
jnz short NOKEY
in   al, 60h
dec  al       ; exit if escape key pressed
jz HOME
; placeholder for checking more keys using a table of keys
NOKEY:

jmp P1
;------------------------
HOME:
cli
xor al, al    ; enable IRQ 1
out 21h, al
sti
mov ah, 1     ; clear keyboard buffer
int 16h
; placeholder for terminate program

我关心的一个问题是,您是否正在尝试制作EXE或COM程序。您使用model TINY建议您可能正在生成一个COM程序,但您没有设置COM程序所需的类似ORG 100h的组织,而是设置了一个仅适用于EXE的堆栈。您没有设置DS寄存器,它也指示COM程序。你能告诉我们你用来汇编和链接这些代码的命令吗?您是否打算制作EXE或COM程序?是的,您可能正在运行16位版本的TASM。无法运行任何程序的16位版本。您需要从DOSBox之类的内部运行TASM。如果您运行的是32位版本的Windows,则可以运行它。但是,即使您确实让它工作了,也不会禁用所有WinODW的键盘,如果您正试图这样做的话。DOSBox是一个软件,而不是dos窗口。您是从哪里安装TASM的?组装不是问题。如果要禁用所有Windows 8的鼠标或键盘,则无论是用汇编语言还是其他语言编写的DOS程序都不能使用。我认为你需要开始考虑编写Windows软件,而不是DOS。即使您使用的是32位版本,DOS程序也无法接管所有Windows 8。320位Windows上的DOS程序只能在DOS会话中接管鼠标和键盘,就是这样。在64位windows上,DOS程序甚至不会运行。你可以找到很多-使用谷歌。谢谢,但我不想只在DOSBOX上使用它,但我想在所有windows上都使用它。@mostafayasin:你知道,从NT派生的windows版本是适当的保护模式操作系统,不只是让用户程序钩住中断向量,对吗?你需要写一个内核模式的设备驱动程序或其他东西。这可能适用于在windows下运行的DOS程序,但是,在模拟的DOS环境中。@PeterCordes您可能对制作设备驱动程序有一些正确的说法,但为此,我可以让设备驱动程序控制通过特定端口连接的特定设备,如果我编程了内核设备驱动程序,则无法满足我的需要,因为我希望在系统运行期间禁用和启用特定设备,而无需重新启动操作系统。。这可以通过KMDF实现吗?我不这么认为。