自测光驱速度的小程序

Author: 北京 黄 震 Date: 1996-11-15

        基本原理  光驱的性能可通过转速、寻址时间、差错率等来衡量,但最重要指标是平均传输速率。我们可以这样测试平均传输速率:记录一定时间内(本程序取5秒)光驱读取的光盘扇区数,将之乘以一个扇区的大小(2KB),然后除以所用时间便得到光驱的平均传输速率。倍速,四速,六速光驱的标准传输速率分别为300KB/S,600KB/S,900KB/S。
        程序中时间的读取可使用BIOS中断的1Ah中断,光盘读取可使用2FH中断,具体说明如下:
        一、读时钟
        AH=0
        INT 21H
        返回变量:CH:CL=小时:分
        DH:DL=秒:1%秒
        二、CD-ROM 安装检查
        BX=0
        AX=1500H
        INT ZFH
        返回变量:BX=CD-ROM个数
        CX=CD-ROM盘号
        三、绝对光盘读入
        BX=缓冲区偏移量
        CX=CD-ROM盘号
        DX=一次所读扇区数
        ES=缓冲区段地址
        SI=起始扇区高位字
        DI=起始扇区低位字
        AX=1508H
        INT 2FH
        返回变量:ES:BX=缓冲区段地址:偏移量
        AL=错误代码(第15位标志位为1)
        本程序在Pentium-133,六倍速光驱上调试通过。
        data segment
        drate db'Average Speed Rate;'
        drate1 db 6dup(20h),'kb/s',0dh,0ah,24h
        msg db 0dh,0ah,'Running Test',0dh,0ah,24h
        time dw 0
        cd-num dw 0
        cd-name dw 0
        buf db 2000 dup(?)
        data ends
        ;
        code segment
        main proc far
        assume cs:code,ds:data,es:data
        start;
        push ds
        sub ax,ax
        push ax
        mov ax,data
        mov ds,ax
        mov es,ax
        lea dx,msg
        mov ah,9
        int 21h
        ;
        mov bx,0
        mov ax,1500h
        int 2fh
        or bx,bx
        jz exit
        ;
        mov word ptr ds:[cd-num],bx
        mov word ptr ds:[cd-name],cx
        cd1;
        mov ah,0
        int 1ah
        mov si,0
        mov di,1
        mov bx,dx
        add bx,91
        mov word ptr ds:[time],bx
        account:
        mov cx,ds:[cd-name]
        mov bx,offset buf
        mov dx,1
        mov ax,1508h
        int 2fh   绝对光盘读入
        mov bx,ds:[time]
        mov ah,0
        int 1 ah   读时钟计数
        inc di
        cmp bx,dx
        ja account   记录在5秒内光驱所读取的光盘扇区数,乘以2KB,除以5秒,得到平均传输速率
        dec di
        mov bx,0
        mov dx,0
        mov ax,di
        mov cx,2
        mul cx
        mov cx,5
        div cx
        int 3
        ;account over
        call change
        lea dx,drate
        mov ah,9
        int 21h
        dec word ptr ds:[cd-num]
        cmp word ptr ds:[cd-num],0
        jz exit
        inc word ptr ds:[cd-name]
        jmp cd1
        exit:mov ah,4ch
        int 21hx   结束程序
        main endp
        change proc near
        lea bx,dratel
        mov cx,6
        push di
        mov di,bx
        push ax
        mov al,20h
        cld
        vePNZ stosb
        pop ax
        mov bx,di
        pop di
        mov si,10
        cc:mov dx,0
        div si
        add d1,30h
        mov byte ptr[bx],d1
        dec bx
        or ax,ax
        jnz cc
        ret
        change endp
        ;
        code ends
        end start   (北京   黄  震)