大家不要被代码的长度吓着
其实问题很简单
就是红色部分的代码和绿色部分的代码交换位置后
程序调试结果不一样
我是在cmd debug下调试的
如果红色部分放在绿色部分前面的话
调试执行到
mov word ptr ds:[9*4],204h
的时候就会弹出一个出错的窗口
而红色部分放在绿色后面就不会提示出错
请问这是咋回事儿啊
assume cs:code
code segment
w:
mov ax,0
mov ds,ax
mov ax,ds:[9*4]
mov ds:[200h],ax
mov ax,ds:[9*4+2] ;将原int9中断程序地址保存
mov ds:[202h],ax
cli
mov word ptr ds:[9*4],204h
mov word ptr ds:[9*4+2],0 ;写入新int9中断程序的地址
sti
mov ax,code
mov ds,ax
mov si,offset int9
mov ax,0
mov es,ax
mov di,204
mov cx,offset int9ret-offset int9
cld
rep movsb
mov ax,4c00h
int 21h
int9:
push cx
mov ax,0
mov ds,ax
mov bx,1
in al,60h
cmp al,3Bh
jne ok
mov ax,0b800h
mov es,ax
mov cx,2000
s: mov byte ptr es:[bx],00101100b
add bx,2
loop s
ok:
pushf
pushf
pop bx
and bl,11111100b
push bx
popf
call dword ptr ds:[200]
int9ret:pop cx
iret
code ends
end w
------解决方案--------------------------------------------------------
红色在绿色前面:
将改写INT 9(键盘中断)的向量,所以在T到(估计你是T到)mov word ptr ds:[9*4],204h (被执行后),INT 9向量(引导值不就完了,说向量容易迷惑人--那么喜欢字面翻译...)的偏移地址和段地址将发生错位.所以你再按下键盘的T时就麻烦来了...
绿色在红色前面:
由于
mov ax,code
mov ds,ax;(绿色部分的)
将使DS=CS
那么
mov word ptr ds:[9*4],204h
mov word ptr ds:[9*4+2],0
将没改写掉INT 9的向量.
0:[9*4]和0:[9*4+2]里面还是原来的值,改写不成功,自然按键盘T没问题了...
没仔细看你的int9:和整个程序了,估计新int9会有问题...