当前位置: 代码迷 >> 汇编语言 >> 小弟又遇到有关问题了,等高手解答
  详细解决方案

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

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

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

  相关解决方案