;------以下为新的int 9 中断例程------------------
int9: push ax
push bx
push es ;用到的寄存器入栈
in al,60h ;从60端口读入一个字节到al
pushf ;flag入栈
pushf ;flag再次入栈为了修改IF,TF置0(
pop bx ;将flag赋值给bx
and bh,11111100b ;将高位中的IF,TF置0(不可屏蔽中断)
push bx ;将修改后的BX入栈
popf ;修改当前标志位(IF,TF为0)
call dword ptr ds:[0] ;对int 指令进行模拟,调用原来的int 9中断例程
cmp al,1 ;esc的扫描码是1
jne int9ret ;如果不是esc(1)就重新执行
mov ax,0b800h
mov es,ax
inc byte ptr es:[160*12+40*2+1] ;将属性值加1,改变颜色
int9ret:pop es
pop bx
pop ax
iret
这里为什么要用 call dword ptr ds:[0]?
用了这个 call dword ptr ds:[0] 栈内不就多了 CS和IP了吗?那最后 iret返回的数据不就不对了吗?(理论上)
还有像cmp al,1 ;esc的扫描码是1
jne int9ret ;如果不是esc(1)就重新执行
mov ax,0b800h
mov es,ax
inc byte ptr es:[160*12+40*2+1] ;将属性值加1,改变颜色
不应该放在call dword ptr ds:[0]前面执行吗? 求解啊.. |