发信人: 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]
|
|