. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  15.5节  例题的疑问  [已解决] 回复[ 3次 ]   点击[ 451次 ]  
402306834
[帖 主]   [ 发表时间:2009-10-27 17:51 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-09-25 17:09
assume cs:code

stack segment
        db 128 dup (0)
stack ends

code segment
start:   mov ax,stack
         mov ss,ax
         mov sp,128
         
         mov ax,code
         mov ds,ax
         mov si,offset int9
         mov ax,0
         mov es,ax
         mov di,204h
         mov cx,offset int9end-offset int9
         cld
         rep movsb
         
       
         push es: [9*4]                ;把原int9的地址存放在0:200h处
         pop  es:[200h]
         push es:[9*4+2]
         pop  es:[202h]
        
         cli
         mov word ptr es:[9*4],204h     ;设置中断向量的入口地址 
         mov word ptr es:[9*4+2],0
         sti
         
         mov ax,0b800h
         mov es,ax
         mov ah,'a'
 s1:     mov  es:[160*12+40*2],ah
         call delay
         inc ah
         cmp ah,'z'
         jna s1
         
         mov ax,0
         mov es,ax
         push es:[200h]
         pop  es:[9*4]
         push es:[202h]
         pop  es:[9*4+2]
         
         mov ax,4c00h
         int 21h
         
int9:    push ax
         push bx
         push cx
         push es
         
         in al,60h
         
         
        
         pushf
         call dword ptr cs:[200h] 
 
 
                                  
         cmp al,3bh                  
         jne int9ret
         
         mov bx,0b800h
         mov bx,1
         mov cx,2000
    s:   inc byte ptr es:[bx]
         add bx,2
         loop s
         
         
int9ret: pop es
         pop cx
         pop bx
         pop ax
         iret
int9end: nop

delay:   push dx
         push ax
         mov dx,3000h
         mov ax,0
    s2:  sub ax,1
         
         cmp ax,0
         jne s2
         sub dx,1
         cmp dx,0
         jne s2
         pop ax
         pop dx
         ret
         
         

code ends
end start
         
 如果把调用原int9的程序
call dword ptr cs:[200h]
改为
mov bx,0
mov es,bx
call dword ptr es:[200h]
后,程序为什么不能正常运行了?
谢谢!!
mess
[第1楼]   [ 回复时间:2009-10-29 10:46 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
楼主的思路没问题,在执行call dword ptr cs:[200h] 时,cs=0。改成
mov bx,0 
mov es,bx 
call dword ptr es:[200h] 
没有问题。

需要注意的是,改完之后要推出当前dos,新启动一个dos实现。(因为如果有以前实验的话,中断向量表里面的地址已经不是BIOS提供的int 9中断地址了)
402306834
[第2楼]   [ 回复时间:2009-11-08 22:56 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-09-25 17:09
谢谢!!
402306834
[第3楼]   [ 回复时间:2009-11-08 23:00 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-09-25 17:09
此贴由 贴主 于 [ 2009-11-08 23:00 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved