⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 findbad.asm

📁 查找硬盘坏扇区并快速标出坏扇区 (FindBad v1.3)
💻 ASM
📖 第 1 页 / 共 2 页
字号:
       mov bh,00h
       mov dl,80h
       int 13h
       ;-------------------
       mov si,OFFSET NO_F_DAT
       mov al,00h
       mov test_h,al
       mov al,[si+2]
       mov test_s,al
       mov al,[si+3]
       mov test_c,al
       mov ax,dos_start_c
       mov si,offset testhd
       add si,ax
       
       mov ch,test_c
test9: mov dh,test_h
test10:mov ah,04h
       mov al,ns
       mov cl,test_s
       mov dl,80h
       int 13h
       jnb test11
       mov ah,31h ;写入坏柱
       mov [si],ah
       jmp test12
test11:inc dh
       mov ah,nh
       dec ah
       cmp dh,ah
       jnz test10
test12:inc si
       clc
       add ch,1h
       jnc test13
       mov ah,test_s
       add ah,40h
       mov test_s,ah
test13:mov ax,nc
       dec ax
       mov di,ax
       mov ah,test_s
       shr ah,1h
       shr ah,1h
       shr ah,1h
       shr ah,1h
       shr ah,1h
       shr ah,1h
       mov al,ch
       mov test_c,ch
       call dsp_test_c_nc ;在屏幕上显示当前Test_c of Nc
       cmp ax,di
       jnz test9

       pop di
       pop si
       popf
       pop dx
       pop cx
       pop bx
       pop ax
       ret
tests endp
phy_chs_dos_rs proc near
;物理柱扇头转成逻辑扇区
;输入:phy_c/h/s nh ns dos_start_c/h/s
;输出:dos_rs
       push ax
       push bx
       push cx
       push dx
       pushf
       push si
       push di

       mov ax,phy_1c_ns
       mov bx,phy_c
       mov cx,dos_start_c
       sub bx,cx
       mul bx
       mov di,dx
       mov si,ax
       ;-----------------
       mov al,ns
       mov bh,phy_h
       mul bh
       add si,ax
       jnc p_c_d1
       inc di
p_c_d1:mov al,ns
       mov bh,dos_start_h
       mul bh
       sub si,ax
       jnc p_c_d2
       dec di
p_c_d2:mov ah,00h
       mov al,phy_s
       add si,ax
       jnc p_c_d3
       inc di
p_c_d3:mov ah,00h
       mov al,dos_start_s
       sub si,ax
       jnc p_c_d4
       dec di
p_c_d4:mov dos_rs_l16,si
       mov dos_rs_h16,di

       pop di
       pop si
       popf
       pop dx
       pop cx
       pop bx
       pop ax
       ret
phy_chs_dos_rs endp
dos_rs_ch proc near
;逻辑扇区dos_rs转成dos_CH
;输入:dos_rs bn_A/B/C/E
;输出:dos_CH
       push ax
       push bx
       push cx
       push dx
       pushf
       push si
       push di

       mov di,dos_rs_h16
       mov si,dos_rs_l16
       mov ax,bn_A
       sub si,ax
       jnc d_r_c1
       dec di
d_r_c1:mov ax,bn_B
       mov bh,00h
       mov bl,bn_c
       mul bx
       sub si,ax
       jnc d_r_c2
       dec di
d_r_c2:sub di,dx
       mov dx,di
       mov ax,si
       mov bl,bn_E
       mov bh,00h
       mov dx,00h
       mov ax,di
       div bx
       mov cx,ax
       mov ax,si
       div bx
       mov dx,cx
       add ax,2h
       jnc d_r_c3
       inc dx
d_r_c3:mov dos_CH_L16,ax
       mov dos_CH_H16,dx

       pop di
       pop si
       popf
       pop dx
       pop cx
       pop bx
       pop ax
       ret
dos_rs_ch endp
dos_rs_phy_int13 proc near
;将逻辑扇区dos_rs转成phy_c/h/s>int13_c/h/s
;输入:dos_rs,ns,nh,dos_start_h/s/c
;输出:phy_c/h/s & int13_c/h/s
       push ax
       push bx
       push cx
       push dx
       pushf
       push si
       push di

       mov si,dos_rs_L16
       mov di,dos_rs_H16
       ;phy_s-----------
       mov bl,ns
       mov bh,00h
       mov dx,0h
       mov ax,di
       div bx
       mov ax,si
       div bx
       mov ah,00h
       mov al,dos_start_s
       add dx,ax
       mov phy_s,dl
       ;phy_h------------
       mov bl,ns
       mov bh,00h
       mov dx,0h
       mov ax,di
       div bx
       mov cx,ax
       mov ax,si
       div bx
       mov dx,cx
       push ax
       mov ax,dx
       mov dx,0h
       mov bl,nh
       mov bh,0h
       div bx
       pop ax
       div bx
       push ax
       mov al,dos_start_h
       add dl,al
       mov phy_h,dl
       ;phy_c------------
       pop ax
       mov dx,dos_start_c
       add ax,dx
       mov phy_c,ax
       ;------------------
       call phychs_int13

       pop di
       pop si
       popf
       pop dx
       pop cx
       pop bx
       pop ax
       ret
dos_rs_phy_int13 endp
read_int13_1c proc near
       push ax
       push bx
       push cx
       push dx
       pushf
       push si
       push di

       mov ah,00h
       mov bh,00h
       mov dl,80h
       int 13h
       mov ax,0201h
       mov bx,offset temp_dat
       mov dl,80h
       mov dh,int13_h
       mov cl,int13_s
       mov ch,int13_c
       int 13h

       pop di
       pop si
       popf
       pop dx
       pop cx
       pop bx
       pop ax
       ret
read_int13_1c endp
writ_int13_1c proc near
       push ax
       push bx
       push cx
       push dx
       pushf
       push si
       push di

       mov ah,00h
       mov bh,00h
       mov dl,80h
       int 13h
       mov ax,0301h    ;0301h
       mov bx,offset temp_dat
       mov dl,80h
       mov dh,int13_h
       mov cl,int13_s
       mov ch,int13_c
       int 13h

       pop di
       pop si
       popf
       pop dx
       pop cx
       pop bx
       pop ax
       ret
writ_int13_1c endp
writ_int13_1c_bad_dat proc near
       push ax
       push bx
       push cx
       push dx
       pushf
       push si
       push di

       mov ah,00h
       mov bh,00h
       mov dl,80h
       int 13h
       mov ax,0301h   ;0301h
       mov bx,offset bad_dat
       mov dl,80h
       mov dh,int13_h
       mov cl,int13_s
       mov ch,int13_c
       int 13h

       pop di
       pop si
       popf
       pop dx
       pop cx
       pop bx
       pop ax
       ret
writ_int13_1c_bad_dat endp
write_bad proc near
;净化testhd区--A
;查找TESTHD表中第一个“31H”,记录下第几柱面至BAD_C,并将此"31H"改写成"30H"--B
;将BAD_C送往PHY_C,phy_h置0h phy_s置01h---C
;计算出dos_rs-->dos_CH(起)---D
;将dos_rs加上phy_1c_ns-->dos_CH(终)---E
;A=dos_ch(起) DIV 80h +begin_FAT1_rs==>int13_c/h/s 
;           并从dos_ch(起) MOD 80h处改写0ffffff7h至扇区尾
;B=dos_ch(终) DIV 80h +begin_FAT1_rs
;将A+1开始连续写入整扇区的0ffffff7h直至B-1
;B==>int13_c/h/s 并从0至dos_ch(终) MOD 80h写0ffffff7h至扇区
;重复搜表"31h"以nc为参考,直至全为"30h"处理完毕
       push ax
       push bx
       push cx
       push dx
       pushf
       push si
       push di

       ;-------------A
       mov bx,dos_start_c
       mov si,offset testhd
       add bx,si
       mov al,[bx]
       cmp al,31h
       jnz write_bad_0
       mov dx,offset err_dos_start_c
       mov ah,09h
       int 21h
       mov ax,4c00h
       int 21h
       ret
write_bad_0:mov cx,dos_start_c
       cmp cx,00h
       jz w_b_0
       mov al,30h
write_bad_0a:mov [si],al
       inc si
       dec cx
       jnz write_bad_0a

       ;-------------B
w_b_0: mov cx,nc
       mov bx,0h
       mov si,offset testhd
w_b_1: mov al,[si]
       cmp al,31h
       jz write_bad_1
       inc bx 
       inc si
       dec cx
       jnz w_b_1
       jmp w_b_exit
write_bad_1:mov bad_c,bx
       mov al,30h
       mov [si],al

       ;------------C
       mov ax,bad_c
       mov phy_c,ax
       mov ah,00h
       mov al,01h
       mov phy_h,ah
       mov phy_s,al

       ;------------D
       call phy_chs_dos_rs
       call dos_rs_ch
       mov ax,dos_ch_L16
       mov dx,dos_ch_H16
       mov dos_CH_Bg_L16,ax
       mov dos_CH_Bg_H16,dx

       ;------------E
       mov bx,phy_1c_ns
       mov ax,dos_rs_L16
       mov dx,dos_rs_H16
       add ax,bx
       jnc write_bad_2
       inc dx
write_bad_2:mov dos_rs_L16,ax
       mov dos_rs_H16,dx
       call dos_rs_ch
       mov ax,dos_ch_L16
       mov dx,dos_ch_H16
       mov dos_ch_ED_L16,ax
       mov dos_ch_ED_H16,dx

       ;--------------F
        mov ax,dos_ch_Bg_L16
        mov dx,dos_ch_bg_H16
        mov bx,80h ;注:sector/4=80h
        div bx
        mov write_sector_bg_no,dx
        mov dx,00h
        mov si,begin_FAT1_rs_L16
        mov di,begin_FAT1_rs_H16
        add ax,si
        jnc write_bad_3
        inc dx
write_bad_3:add dx,di
        mov FAT1_Bad_ch_rs1_L16,ax
        mov FAT1_Bad_ch_rs1_H16,dx
        
        ;---------------------
        mov ax,dos_ch_ED_L16
        mov dx,dos_ch_ED_H16
        mov bx,80h ;同上
        div bx
        mov write_sector_ED_no,dx
        mov dx,00h
        mov si,begin_FAT1_rs_L16
        mov di,begin_FAT1_rs_H16
        add ax,si
        jnc write_BAD_4
        inc dx
write_BAD_4:add dx,di
        mov FAT1_BAD_CH_rs2_L16,ax
        mov FAT1_BAD_CH_rs2_H16,dx

        ;---------------------
         mov ax,FAT1_BAD_ch_rs1_L16
         mov dx,FAT1_BAD_ch_rs1_H16
         mov dos_rs_L16,ax
         mov dos_rs_H16,dx
         call dos_rs_phy_int13
         call read_int13_1c
         mov si,offset temp_dat
         mov di,si
         add di,200h
         mov cx,write_sector_Bg_no
         mov ax,04h
         mul cx
         mov cx,ax
         add si,cx
         mov ax,0fff7h
         mov dx,0fffh
write_bad_5:mov [si],ax
         mov [si+2h],dx
         add si,4h
         cmp si,di
         jnz write_bad_5
         call writ_int13_1c
        ;-----------------
w_b_5:  mov ax,dos_rs_L16
        mov dx,dos_rs_H16
        add ax,1h
        jnc w_b_6
        inc dx
w_b_6:  mov si,FAT1_BAD_ch_rs2_L16
        mov di,FAT1_BAD_ch_rs2_H16
        cmp dx,di
        jnz w_b_7
        cmp ax,si
        jnz w_b_7
        jmp w_b_8
w_b_7:  mov dos_rs_L16,ax
        mov dos_rs_H16,dx
        call dos_rs_phy_int13
        call writ_int13_1c_bad_dat
        jmp w_b_5
        ;------------------
w_b_8:  mov dos_rs_L16,ax
        mov dos_rs_H16,dx
        call dos_rs_phy_int13
        call read_int13_1c
        mov si,offset temp_dat
        mov cx,write_sector_Ed_no
        mov ax,0fff7h
        mov dx,0fffh
w_b_9:  mov [si],ax
        mov [si+2],dx
        add si,4h
        dec cx
        jnz w_b_9
        call writ_int13_1c

        jmp w_b_0  ;返回开始重新寻找下一坏柱

w_b_exit: nop


       pop di
       pop si
       popf
       pop dx
       pop cx
       pop bx
       pop ax
       ret
write_bad endp
copy_FAT1_FAT2 proc near
       push ax
       push bx
       push cx
       push dx
       pushf
       push si
       push di

       mov ax,begin_FAT1_rs_L16
       mov dx,begin_FAT1_rs_H16
       mov si,begin_FAT2_rs_L16
       mov di,begin_FAT2_rs_H16
       mov cpy_fat1_fat2_2_L16,si
       mov cpy_fat1_fat2_2_H16,di
       push si
       push di
cp_f0: mov dos_rs_L16,ax
       mov dos_rs_H16,dx
       call dos_rs_phy_int13
       call read_int13_1c
       mov dos_rs_L16,si
       mov dos_rs_H16,di
       call dos_rs_phy_int13
       call read_int13_1c
       add ax,1h
       jnc cp_f1
       inc dx
cp_f1: add si,1h
       jnc cp_f2
       inc di
cp_f2: pop cx ;高位
       pop bx ;低位
       push bx
       push cx
       mov cpy_fat1_fat2_1_L16,ax
       mov cpy_fat1_fat2_1_H16,dx
       call dsp_cpy_fat1_fat2
       cmp cx,dx
       jnz cp_f0
       cmp bx,ax
       jnz cp_f0
       pop cx
       pop bx      


       pop di
       pop si
       popf
       pop dx
       pop cx
       pop bx
       pop ax
       ret
copy_FAT1_FAT2 endp
DSP_VGA11H proc near
;显示640X480分辨率单彩色图形在屏幕上
;输入:VGA11H_DAT
;输出:在屏幕上显示VGA12H单16色之一的图像
       push ax
       push bx
       push cx
       push dx
       pushf
       push si
       push di
       push es

       ;保存当前显示模式
       mov ah,0fh
       int 10h
       push ax
       push bx
       ;置显示模式为图形12H=640X480X16
       mov ax,0a000h
       push ax
       pop es
       mov ax,0012h
       int 10h
       ;显示VGA11h_DAT区图像
       mov si,offset vga11h_dat
       mov di,00h
       mov cx,9600h ;38400
       cli
d_vga_1:mov al,[si]
       mov es:[di],al
       inc di
       inc si
       dec cx
       jnz d_vga_1
       sti
       mov ah,01h
       int 21h
       cmp al,38h ;输入键8继续,其它任意键退出!
       jz d_vga_z2 
       pop bx
       pop ax
       mov ah,00h
       int 10h      

       pop es
       pop di
       pop si
       popf
       pop dx
       pop cx
       pop bx
       pop ax
       pop ax
       mov ax,4c00h
       int 21h
       ret

d_vga_z2:pop bx
       pop ax
       mov ah,00h
       int 10h

       pop es
       pop di
       pop si
       popf
       pop dx
       pop cx
       pop bx
       pop ax
       ret
DSP_VGA11H endp
jisuanRS proc near
       push ax
       push bx
       push cx
       push dx
       pushf
       push si
       push di

       pop di
       pop si
       popf
       pop dx
       pop cx
       pop bx
       pop ax
       ret
jisuanRS endp
code ends
;------------------

;堆栈区
;------------------
stack segment stack 'stack'
       db 1000 dup(0)
stack ends
;------------------
end beg

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -