精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>○ DOS>>中断大全>>INT 19H 中断服务例程注释清单

主题:INT 19H 中断服务例程注释清单
发信人: twotiger()
整理人: sle(2000-04-08 08:37:14), 站内信件
这是我读书时的作业,我看这里很多人都在研究这些东西,就拿出来献丑了 


*********************************
  INT 19H 中断服务例程
**********************************

(一) RomBios版本号
-df000:00c4 015f
F000:00C0              43 6F 70 79-72 69 67 68 74 20 28 63       Copyr
ight (c
F000:00D0  29 20 31 39 38 39 2D 39-34 20 20 4D 52 49 16 4D   ) 1989-94
  MRI.M
F000:00E0  69 63 72 6F 69 64 20 52-65 73 65 61 72 63 68 2C   icroid Re
search,
F000:00F0  20 49 6E 63 2E 20 20 32-33 33 36 44 20 57 61 6C    Inc.  23
36D Wal
F000:0100  73 68 2C 20 53 61 6E 74-61 20 43 6C 61 72 61 2C   sh, Santa
 Clara,
F000:0110  20 43 41 2C 20 55 53 41-20 39 35 30 35 31 20 20    CA, USA 
95051  
F000:0120  54 65 6C 3A 20 28 34 30-38 29 20 37 32 37 2D 36   Tel: (408
) 727-6
F000:0130  39 39 31 20 20 46 61 78-3A 20 28 34 30 38 29 20   991  Fax:
 (408) 
F000:0140  37 32 37 2D 36 39 39 36-20 20 13 41 4C 4C 20 52   727-6996 
 .ALL R
F000:0150  49 47 48 54 53 20 52 45-53 45 52 56 45 44 20 20   IGHTS RES
ERVED  

(二) 数据单元
-df000:bc6a
F000:BC60                                35 0D 0A 50 72 65            
 5..Pre
F000:BC70  73 73 20 20 20 46 31 20-74 6F 20 42 6F 6F 74 20   ss   F1 t
o Boot 
F000:BC80  46 6C 6F 70 70 79 0D 0A-20 20 20 20 20 20 20 20   Floppy.. 
       
F000:BC90  46 32 20 74 6F 20 42 6F-6F 74 20 46 69 78 65 64   F2 to Boo
t Fixed
F000:BCA0  1C 0D 0A 20 20 20 20 20-20 20 20 46 33 20 74 6F   ...      
  F3 to
F000:BCB0  20 42 6F 6F 74 20 4E 65-74 77 6F 72 6B 04 0D 0A    Boot Net
work...
F000:BCC0  0D 0A 02 20 20 02 46 31-02 46 32 02 46 33 02 41   ...  .F1.
F2.F3.A
F000:BCD0  3A 02 42 3A 02 43 3A 02-44 3A 02 45 3A 02 46 3A   :.B:.C:.D
:.E:.F:
F000:BCE0  01 4E CE BC D1 BC D4 BC-D7 BC                     .N.......
.

-df000:bce2 LA0
F000:BCE0        CE BC D1 BC D4 BC-D7 BC DA BC DD BC C5 BC     .......
.......
F000:BCF0  C8 BC CB BC E0 BC 47 0D-0A 42 6F 6F 74 20 46 61   ......G..
Boot Fa
F000:BD00  69 6C 75 72 65 20 2D 20-49 6E 73 65 72 74 20 53   ilure - I
nsert S
F000:BD10  79 73 74 65 6D 20 44 69-73 6B 65 74 74 65 2C 20   ystem Dis
kette, 
F000:BD20  74 68 65 6E 20 50 72 65-73 73 20 41 6E 79 20 4B   then Pres
s Any K
F000:BD30  65 79 20 74 6F 20 43 6F-6E 74 69 6E 75 65 2A 0D   ey to Con
tinue*.
F000:BD40  0A 42 6F 6F 74 20 46 61-69 6C 75 72 65 20 2D 20   .Boot Fai
lure - 
F000:BD50  4E 6F 20 42 6F 6F 74 20-44 65 76 69 63 65 20 43   No Boot D
evice C
F000:BD60  6F 6E 66 69 67 75 72 65-64 BE C2 BC E8 4D D8 D1   onfigured
....M..
F000:BD70  E7 2E 8B B5 E2 BC E8 43-D8 BE BD BC E9 3D D8 66   .......C.
....=.f
F000:BD80  33 C0                                             3.

(三) 指令单元所用的重要数据说明
byte ptr [0040:0010]  保存与计算机连接的设备编号
byte ptr[0040:0016]     (此字节原为保留).若用ALT+CTRL+ENTER启动,
此字节最高位被置为1
byte ptr[bp]            此字节保存驱动器数目
word ptr[bp+2]          此字节保存已尝试的驱动器数目
[bp+4]                  从此字节开始,保存相应的软.硬盘逻辑编号
CMOS中 1c 内容 (此字节原为保留).保存所设定的启动方式
第二位为1,表示NetWork First 方式
第一位为1,表示Screen Prompt方式
第零位为1,表示先硬盘后A盘方式 第零.一位为1,表示AutoS
earch方式
第零位为0,表示先A盘后硬盘方式
(四)指令单元
//Turbo Debugger Log
//CPU 80486
F000:E6F2 E98AD6         jmp    BD7F       ;INT19 入口
F000:BD7F 6633C0         xor    eax,eax    ;初始化各寄存器            
        
F000:BD82 8EE0           mov    fs,ax                        
F000:BD84 8EE8           mov    gs,ax                        
F000:BD86 660FB7C9       movzx  ecx,cx                       
F000:BD8A 660FB7D2       movzx  edx,dx                       
F000:BD8E 660FB7DB       movzx  ebx,bx                       
F000:BD92 660FB7E4       movzx  esp,sp                       
F000:BD96 660FB7ED       movzx  ebp,bp                       
F000:BD9A 660FB7F6       movzx  esi,si                       
F000:BD9E 660FB7FF       movzx  edi,di                       
F000:BDA2 83EC0A         sub    sp,000A    ;sp=sp-000a=fff4           
         
F000:BDA5 8BEC           mov    bp,sp      ;bp=sp=fff4                
  
F000:BDA7 C746020000     mov    word ptr [bp+02],0000
;[bp+2]保存保存已尝试的驱动器数目,此时清零
F000:BDAC 6A40           push   0040                         
F000:BDAE 1F             pop    ds         ;ds=0040                  

F000:BDAF F606160080     test   byte ptr [0016],80 
;最高位是否为1(是否用ALT+CTRL+ENTER启动)          
F000:BDB4 754E           jne    BE04       ;若最高位为1,则转          
        
F000:BDB6 FA             cli                                 
F000:BDB7 B01C           mov    al,1C      ;读CMOS中1c号寄存器内容送AL
                   
F000:BDB9 E81E2D         call   EADA       ;(注:此字节保存CMOS所设定的
启动方式)                  
F000:BDBC FB             sti                                 
F000:BDBD A804           test   al,04      ;是否NetWork First方式     
             
F000:BDBF 7405           je     BDC6       ;否,则转bdc6               
   
F000:BDC1 E80102         call   BFC5       ;是否有网络启动            
      
F000:BDC4 7563           jne    BE29       ;有,则转be29               
   
F000:BDC6 2403           and    al,03                        
F000:BDC8 3C02           cmp    al,02      ;是否Screen Prompt方式     
             
F000:BDCA 7438           je     BE04       ;是,转be04                 
 
F000:BDCC 3C03           cmp    al,03      ;是否AutoSearch方式        
          
F000:BDCE 7414           je     BDE4       ;是,转bde4                 
 
F000:BDD0 3C01           cmp    al,01      ;是否先硬盘后A盘方式       
           
F000:BDD2 B88000         mov    ax,0080                      
F000:BDD5 7402           je     BDD9       ;是,转bdd9                 
 
F000:BDD7 86C4           xchg   ah,al      ;否,则为先A盘后硬盘方式   
               
F000:BDD9 894604         mov    [bp+04],ax  ; 相应的软.硬盘逻辑编号送[
bp+04]                 
F000:BDDC C746000200     mov    word ptr [bp],0002 ; 驱动器数目送[bp] 
         
F000:BDE1 E9BA00         jmp    BE9E       ;转be9e                  
F000:BDE4 A01000         mov    al,[0010]  ;设备编码表送AL            
      
F000:BDE7 C0E806         shr    al,06      ;软盘驱动器数目送AL        
          
F000:BDEA 98             cbw               ;软盘驱动器数目送AX 
F000:BDEB 40             inc    ax         ;软.硬盘驱动器数目送AX 
F000:BDEC 894600         mov    [bp],ax    ;软.硬盘驱动器数目送[bp]   
               
F000:BDEF 91             xchg   cx,ax                        
F000:BDF0 33FF           xor    di,di      ;(BDF0 - BDFD)             
      
F000:BDF2 8BC7           mov    ax,di      ;相应逻辑驱动器号送[bp+di+0
4]                  
F000:BDF4 884304         mov    [bp+di+04],al                
F000:BDF7 47             inc    di                           
F000:BDF8 E2F8           loop   BDF2                         
F000:BDFA FF4600         inc    word ptr [bp]                
F000:BDFD C6430480       mov    byte ptr [bp+di+04],80       
F000:BE01 E99A00         jmp    BE9E                         
F000:BE04 BE6ABC         mov    si,BC6A    ;显示"Press F1 to Boot Flop
py                  
F000:BE07 E8B2D7         call   95BC       ;     Press F2 to Boot Fixe
d"           
F000:BE0A E8B801         call   BFC5       ;是否有网络启动            
      
F000:BE0D 7406           je     BE15       ;没有,转be15               
   
F000:BE0F BEA0BC         mov    si,BCA0    ;有,显示"Press F3 to Boot N
etWork"                  
F000:BE12 E8A7D7         call   95BC                         
F000:BE15 B410           mov    ah,10      ;扩展键盘读                
  
F000:BE17 CD16           int    16                           
F000:BE19 3D003D         cmp    ax,3D00    ;是否按下F3                
  
F000:BE1C 7514           jne    BE32       ;否,转be32                 
 
F000:BE1E BF0800         mov    di,0008                      
F000:BE21 E8A101         call   BFC5       ;是否有网络启动            
      
F000:BE24 74EF           je     BE15       ;没有,转be15 
F000:BE26 E840FF         call   BD69       ;有,则显示"Insert System Di
sk 
   ;then Press Any Key to Continue"                  
F000:BE29 33C0           xor    ax,ax      ; 网络启动方式入口         
         
F000:BE2B 8ED8           mov    ds,ax                        
F000:BE2D 8EC0           mov    es,ax                        
F000:BE2F E9F300         jmp    BF25       ;转bf25                  
F000:BE32 BF0900         mov    di,0009                      
F000:BE35 3C4E           cmp    al,4E      ;是否按下'N'(网络启动方式) 
                 
F000:BE37 74E8           je     BE21                         
F000:BE39 3C6E           cmp    al,6E      ;是否按下'n'(网络启动方式) 
                 
F000:BE3B 74E4           je     BE21                         
F000:BE3D 3D003B         cmp    ax,3B00    ;是否按下F1(软盘启动方式)  
               
F000:BE40 7508           jne    BE4A                         
F000:BE42 BF0600         mov    di,0006                      
F000:BE45 E821FF         call   BD69                         
F000:BE48 EB9A           jmp    BDE4                         
F000:BE4A 3D003C         cmp    ax,3C00    ;是否按下F2(硬盘启动方式)  
                
F000:BE4D 7508           jne    BE57                         
F000:BE4F BF0700         mov    di,0007                      
F000:BE52 B80200         mov    ax,0002                      
F000:BE55 EB17           jmp    BE6E                         
F000:BE57 3C41           cmp    al,41      ;是否按下'A'-'F'           
       
F000:BE59 72BA           jb     BE15       ;(指定某一驱动器启动)      
            
F000:BE5B 3C46           cmp    al,46        ;因为本主板最多能接2个硬盘
                  
F000:BE5D 760A           jbe    BE69         ;4个软驱,所以是'A'-'F'   
               
F000:BE5F 3C61           cmp    al,61      ;是否按下'a' - 'f'         
         
F000:BE61 72B2           jb     BE15       ;(指定某一驱动器启动)      
            
F000:BE63 3C66           cmp    al,66         ;因为本主板最多能接2个硬
盘               
F000:BE65 77AE           ja     BE15          ;4个软驱,所以是'A'-'F'  
             
F000:BE67 2C20           sub    al,20      ;小写字母变大写字母        
          
F000:BE69 2C41           sub    al,41      ;大写字母变逻辑驱动器号    
              
F000:BE6B 98             cbw               ;逻辑驱动器号送AL          
        
F000:BE6C 8BF8           mov    di,ax      ;逻辑驱动器号送DI          
        
F000:BE6E 93             xchg   bx,ax                       
F000:BE6F A07500         mov    al,[0075]  ;硬盘驱动器号送AL          
        
F000:BE72 3C02           cmp    al,02                       
F000:BE74 7202           jb     BE78                         
F000:BE76 B002           mov    al,02                        
F000:BE78 B418           mov    ah,18                        
F000:BE7A F6E4           mul    ah                           
F000:BE7C 03D8           add    bx,ax                        
F000:BE7E A01000         mov    al,[0010]                    
F000:BE81 C0E806         shr    al,06                        
F000:BE84 B406           mov    ah,06                        
F000:BE86 F6E4           mul    ah                           
F000:BE88 03D8           add    bx,ax                        
F000:BE8A 2E8A8722BC     mov    al,cs:[bx-43DE]              
F000:BE8F 3CFF           cmp    al,FF                        
F000:BE91 7482           je     BE15                         
F000:BE93 884604         mov    [bp+04],al                   
F000:BE96 C746000100     mov    word ptr [bp],0001           
F000:BE9B E8CBFE         call   BD69                         
F000:BE9E 8B7E02         mov    di,[bp+02]     ;已尝试驱动器数目送DI  
            
F000:BEA1 8A5304         mov    dl,[bp+di+04]  ;下一个要尝试驱动器号送
DL              
F000:BEA4 E8CE00         call   BF75                         
F000:BEA7 33C0           xor    ax,ax          ;AX = 0              
F000:BEA9 8EC0           mov    es,ax          ;ES = 0              
F000:BEAB 8ED8           mov    ds,ax          ;DS = 0              
F000:BEAD 80FA80         cmp    dl,80          ;是否硬盘              

F000:BEB0 750B           jne    BEBD           ;否,转bebd             
 
F000:BEB2 B00E           mov    al,0E          ;是硬盘              
F000:BEB4 FA             cli                                 
F000:BEB5 E8222C         call   EADA           ;读CMOS中诊断状态字节  
            
F000:BEB8 FB             sti                                 
F000:BEB9 A808           test   al,08          ;检测是否有硬盘错      
        
F000:BEBB 7559           jne    BF16           ;有硬盘错,转bf16       
       
F000:BEBD B90400         mov    cx,0004        ;同一驱动器可试4次     
         
F000:BEC0 8B7E02         mov    di,[bp+02]     ;已尝试驱动器数目送DI  
            
F000:BEC3 8A5304         mov    dl,[bp+di+04]  ;逻辑驱动器号送DL      
        
F000:BEC6 80E280         and    dl,80                        
F000:BEC9 33C0           xor    ax,ax          ;磁盘复位              

F000:BECB CD13           int    13                           
F000:BECD 7245           jb     BF14           ;复位失败,转bf14       
       
F000:BECF 51             push   cx                           
F000:BED0 BB007C         mov    bx,7C00        ;读到0000:7C00处       
       
F000:BED3 B600           mov    dh,00          ;置要读磁头号          
    
F000:BED5 B90100         mov    cx,0001        ;置要读磁道扇区号      
        
F000:BED8 B80102         mov    ax,0201        ;读一个扇区            
  
F000:BEDB CD13           int    13                           
F000:BEDD 59             pop    cx                           
F000:BEDE 722F           jb     BF0F           ;读失败,转bf0f         
     
F000:BEE0 22D2           and    dl,dl                        
F000:BEE2 790A           jns    BEEE                         
F000:BEE4 813EFE7D55AA   cmp    word ptr [7DFE],AA55  
;引导记录模块最后一字是否为AA55H       
F000:BEEA 7414           je     BF00          ;是,转bf00             
  
F000:BEEC EB28           jmp    BF16          ;否,转bf16              
 
F000:BEEE FC             cld                                 
F000:BEEF BE007C         mov    si,7C00                      
F000:BEF2 AD             lodsw                               
F000:BEF3 3C05           cmp    al,05                        
F000:BEF5 761F           jbe    BF16                         
F000:BEF7 8BFE           mov    di,si                        
F000:BEF9 B90800         mov    cx,0008                      
F000:BEFC F3AF           rep scasw                           
F000:BEFE 7416           je     BF16                         
F000:BF00 1E             push   ds                           
F000:BF01 6A40           push   0040                         
F000:BF03 1F             pop    ds                           
F000:BF04 802616007F     and    byte ptr [0016],7F  
;[0040:0016] 最高位清零          
F000:BF09 1F             pop    ds                           
F000:BF0A EA007C0000     jmp    0000:7C00     ;成功,执行引导记录      
         
F000:BF0F 80FC80         cmp    ah,80                        
F000:BF12 7402           je     BF16                         
F000:BF14 E2AA           loop   BEC0         ;复位失败,再试           
     
F000:BF16 8B4602         mov    ax,[bp+02]   ;已尝试驱动器数目加1     
           
F000:BF19 40             inc    ax                           
F000:BF1A 894602         mov    [bp+02],ax                   
F000:BF1D 3B4600         cmp    ax,[bp]      ;是否已试遍所有驱动器    
            
F000:BF20 7303           jnb    BF25         ;是,转bf25               
 
F000:BF22 E979FF         jmp    BE9E         ;否,转be9e               
 
F000:BF25 83C40A         add    sp,000A                      
F000:BF28 E89A00         call   BFC5         ;是否有网络启动          
      
F000:BF2B 7411           je     BF3E         ;否,转bf3e              
  
F000:BF2D 52             push   dx           ;有网络启动              
  
F000:BF2E 33D2           xor    dx,dx                        
F000:BF30 E84200         call   BF75                         
F000:BF33 5A             pop    dx                           
F000:BF34 CD18           int    18                           
F000:BF3E FA             cli                                 
F000:BF3F B80000         mov    ax,0000                      
F000:BF42 8ED0           mov    ss,ax        ;SS=0000                

F000:BF44 BC0004         mov    sp,0400      ;SP=0400                

F000:BF47 B010           mov    al,10                        
F000:BF49 E88E2B         call   EADA         ;从CMOS中读软盘信息送AL  
              
F000:BF4C 8AE0           mov    ah,al        ;AL送AH                
F000:BF4E B012           mov    al,12                        
F000:BF50 E8872B         call   EADA         ;从CMOS中读硬盘信息送AL 

F000:BF53 0AC4           or     al,ah        ;是否有软硬盘            
    
F000:BF55 FB             sti                                 
F000:BF56 C0E804         shr    al,04                        
F000:BF59 BE3EBD         mov    si,BD3E                      
F000:BF5C 7403           je     BF61        
;没有,转bf61 显示" Boot Failure
   No Boot Device Configured."                
F000:BF5E BEF6BC         mov    si,BCF6                      
F000:BF61 E858D6         call   95BC       
有,显示" Boot Failure - Insert
System Diskette then Press Any Key to Continue"                 
  
F000:BF64 B410           mov    ah,10                        
F000:BF66 CD16           int    16           ;接收任一键              
  
F000:BF68 6A40           push   0040   
F000:BF6A 1F             pop    ds                           
F000:BF6B 33C0           xor    ax,ax                        
F000:BF6D A04900         mov    al,[0049]   ;当前视频方式送AL         
        
F000:BF70 CD10           int    10                           
F000:BF72 E92DFE         jmp    BDA2        ;转bda2再试               
  

*********************
  显示字符串子程序
*********************
;入口参数 SI
;功能 显示长度为CS:[SI],从CS:[SI+1]开始的字符串
F000:95BC 2E8A0C         mov    cl,cs:[si]                   
F000:95BF B500           mov    ch,00                        
F000:95C1 46             inc    si                           
F000:95C2 FC             cld                                 
F000:95C3 2EAC           lodsb  cs:                          
F000:95C5 B303           mov    bl,03                        
F000:95C7 B40E           mov    ah,0E                        
F000:95C9 CD10           int    10                           
F000:95CB E2F6           loop   95C3                         
F000:95CD C3             ret                                 

********************
  显示字符串子程序
********************
;入口参数 DI
;功能 显示 cs:[bcc2] ,cs:[di-431e],cs:[bcbd]处字符串
F000:BD69 BEC2BC         mov    si,BCC2                      
F000:BD6C E84DD8         call   95BC                         
F000:BD6F D1E7           shl    di,1                         
F000:BD71 2E8BB5E2BC     mov    si,cs:[di-431E]              
F000:BD76 E843D8         call   95BC                         
F000:BD79 BEBDBC         mov    si,BCBD                      
F000:BD7C E93DD8         jmp    95BC                         

*********************
   子程序
*********************
功能  设置INT 1EH中断向量  取磁盘参数 置块设备命令入口地址
F000:BF75 60             pusha                               
F000:BF76 1E             push   ds                           
F000:BF77 06             push   es                           
F000:BF78 6A40           push   0040                         
F000:BF7A 1F             pop    ds                           
F000:BF7B 8AC2           mov    al,dl                        
F000:BF7D C0E003         shl    al,03                        
F000:BF80 B4E7           mov    ah,E7                        
F000:BF82 84D2           test   dl,dl                        
F000:BF84 7907           jns    BF8D                         
F000:BF86 B200           mov    dl,00                        
F000:BF88 C0E002         shl    al,02                        
F000:BF8B B4C7           mov    ah,C7                        
F000:BF8D FA             cli                                 
F000:BF8E 2226DA00       and    ah,[00DA]                    
F000:BF92 0AC4           or     al,ah                        
F000:BF94 A2DA00         mov    [00DA],al                    
F000:BF97 B8EFEF         mov    ax,EFEF                      
F000:BF9A 21069000       and    [0090],ax                    
F000:BF9E 2106D400       and    [00D4],ax                    
F000:BFA2 B408           mov    ah,08                        
F000:BFA4 CD13           int    13                           
F000:BFA6 7208           jb     BFB0                         
F000:BFA8 8CC3           mov    bx,es                        
F000:BFAA 8BC3           mov    ax,bx                        
F000:BFAC 0BDF           or     bx,di                        
F000:BFAE 7505           jne    BFB5                         
F000:BFB0 BFC7EF         mov    di,EFC7                      
F000:BFB3 8CC8           mov    ax,cs                        
F000:BFB5 FA             cli                                 
F000:BFB6 6A00           push   0000                         
F000:BFB8 1F             pop    ds                           
F000:BFB9 893E7800       mov    [0078],di      ;设置INT 1EH中断向量   
           
F000:BFBD A37A00         mov    [007A],ax                    
F000:BFC0 FB             sti                                 
F000:BFC1 07             pop    es                           
F000:BFC2 1F             pop    ds                           
F000:BFC3 61             popa                                
F000:BFC4 C3             ret                                 

***************
子程序
***************
功能 判断是否有网络启动
F000:BFC5 1E             push   ds                           
F000:BFC6 6A00           push   0000                         
F000:BFC8 1F             pop    ds                           
F000:BFC9 813E620000F0   cmp    word ptr [0062],F000 
;判断INT 18H 高位地址是否为F000
;若不是,则表示有网络启动,此地址被修改        
F000:BFCF 1F             pop    ds                           
F000:BFD0 C3             ret                                 

***************
子程序
***************
功能 从CMOS中读取(al)号的寄存器内容送al
F000:EADA E80100         call   EADE                         
F000:EADD C3             ret                                 

***************
子程序
***************
功能 从CMOS中读取(al)号的寄存器内容送al
F000:EADE E670           out    70,al                        
F000:EAE0 E7EB           out    EB,ax                        
F000:EAE2 E471           in     al,71                        
F000:EAE4 E7EB           out    EB,ax                        
F000:EAE6 C3             ret                                 


--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.135.144]

[关闭][返回]