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 SetInt 9h,KbdEvent(这是什么?)???(MASM)_Assembly_Dos_Interrupt_Masm_Drivers - Fatal编程技术网

Assembly SetInt 9h,KbdEvent(这是什么?)???(MASM)

Assembly SetInt 9h,KbdEvent(这是什么?)???(MASM),assembly,dos,interrupt,masm,drivers,Assembly,Dos,Interrupt,Masm,Drivers,有人能告诉我这两行代码(DOS键盘驱动程序)在做什么吗 OldKbdEvent在代码的其他地方定义如下: OldKbdEvent DD? KbdEvent作为标签存在于代码的其他位置。这些是正在定义的这些符号的唯一实例 在这两行之后,代码向DOS发出一个中断27h(终止并保持驻留),这意味着DOS终止程序,但将其保留在内存中,以便稍后恢复程序 如果您仔细查看代码,我希望您会找到一对宏,GetInt和SetInt。在名称上,它们将获取或存储一个值到位于0000:0000的中断表中-您正在处理Int

有人能告诉我这两行代码(DOS键盘驱动程序)在做什么吗

OldKbdEvent
在代码的其他地方定义如下:
OldKbdEvent DD?
KbdEvent
作为标签存在于代码的其他位置。这些是正在定义的这些符号的唯一实例


在这两行之后,代码向DOS发出一个中断27h(终止并保持驻留),这意味着DOS终止程序,但将其保留在内存中,以便稍后恢复程序

如果您仔细查看代码,我希望您会找到一对宏,
GetInt
SetInt
。在名称上,它们将获取或存储一个值到位于0000:0000的中断表中-您正在处理Int 0x09,因此它们将访问0000:(0x9*4)

基本上,他们在int表中获取和设置键盘处理int的值。16位表由256个条目组成,每个条目4个字节,其中2个用于段,2个用于偏移。当cpu接收到int时,它会在将执行转移到该点之前查找该表中的地址

下面是一些我想象中SetInt所做的代码:

cli                             ;no interruptions
mov bx, 0x09                    ;hardware interrupt #
shl bx, 2                       ;multiply by 4
xor ax, ax
mov gs, ax                      ;start of memory
mov [gs:bx], word keyhandler
mov [gs:bx+2], ds               ; segment
sti

读者注意:使用
gs
(或
fs
)段会将程序限制在80386或更高版本的处理器上。这些段寄存器在286/186/86/88上不可用。看起来您是对的。有一个名为GetInt的宏和另一个名为SetInt的宏。但是,它并没有解释向SetInt宏发送未定义变量KbdEvent的原因。宏如下所示:
SetInt macro Num,Ofs MOV AX,2500H+Num MOV DX,OFFSET of s INT 21H ENDM
它使用DOS INT 21H子函数25h来更改中断表,而不是像示例中那样直接更改中断表。可能是因为没有定义名为KbdEvent的变量,所以它会发送标签的地址吗?@user504882-:)-是的,这个宏确实会发送KbdEvent标签的地址(或偏移量)。但是,传递给int21h-25h的ds:dx必须是新处理程序的地址。因此,如果KbdEvent标签不在代码块的开头,那么调用ints时就会发生错误(tm)。这告诉我,要么一些代码被复制到这个地址,要么它后面紧跟着数据——数据实际上是通过使用db、dw或dd等进行伪装的代码。不确定,在看不到更多代码的情况下,很难做出有建设性的猜测。你能给我们看看标签
KbdEvent
后面出现的代码吗。我猜
KbdEvent
是表示键盘中断时将使用的中断例程的代码。我猜它也会链接到
OldKbdEvent
,因为它将作为TSR运行。
cli                             ;no interruptions
mov bx, 0x09                    ;hardware interrupt #
shl bx, 2                       ;multiply by 4
xor ax, ax
mov gs, ax                      ;start of memory
mov [gs:bx], word keyhandler
mov [gs:bx+2], ds               ; segment
sti