读书人

小弟又遇到有关问题了等高手解答

发布时间: 2012-03-16 16:34:56 作者: rapoo

小弟又遇到问题了,等高手解答
大家不要被代码的长度吓着
其实问题很简单
就是红色部分的代码和绿色部分的代码交换位置后
程序调试结果不一样

我是在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会有问题...

读书人网 >汇编语言

热点推荐