IBM电脑的CMOS中都存储了电脑的型号与序列号,我想在程序中获取此信息,网上也有些文章提到用内嵌汇编获取类似信息(汇编不熟),想破头脑没搞定。
  我是初学者,各位高人指点指点,谢谢。

解决方案 »

  1.   

    读写CMOS内存(delphi)cmos内存的读写 
    一、CMOS内存信息详解 
    一般的PC/AT、286、386、486等微机均配有CMOS芯片,CMOS&127;芯片包含了一个实时钟 
    和64个字节的CMOS内存。在CMOS内存中,0-0DH为实时钟的有关信息,0E-&127;3FH包含 
    计算机的硬件配置信息,如常规内存的大小、扩展内存的大小、&127;软盘的类型、固定 
    盘的类型及其物理参数、显示器的类型等,这些参数与计算机能否正常工作具有密切的 
    关系,另外还有计算机的开机口令和其它辅助设置信息。表1列出了&127;CMOS内存各字 
    节的用途。 
    表1 CMOS内存配置信息的含义 
    地 址 
     功能 
     说明 
    0,1 
     秒,秒报警 
       
    2,3 
     分,分报警 
       
    4,5 
     时,时报警 
       

     星期几 
       
    7,8,9 
     日,月,年 
       

     状态寄存器A 
       

     状态寄存器B 
       

     状态寄存器C 
       

     状态寄存器D 
     0=电池失效,80=电池有效 

     诊断状态 
       

     关机状态 
     由上电诊断定义 
    10 
     软驱 
     高4位为A驱,低4位为B驱,0=无, 1=360KB, 2=1.2KB, 4=1.44KB, 6=720KB 
    11 
     保留 
       
    12 
     固定盘 
     高4位为C驱,低4位为D驱,0=无,F=用户定义盘, 其它为系统定义盘 
    13 
     保留 
       
    14 
     设备状态 
     标志驱动器数、显示器类型、有无数学处理器等 
    15-16 
     内存 
     以KB计的常规内存数,100H=256KB,200H=512KB, 280H=640KB 
    17-18 
     扩展内存 
     以KB计的扩展内存数,200H=512KB,400H=1024KB等 
    19 
     C盘类型数 
     根据具体硬盘类型而定 
    1A 
     D盘类型数 
     根据具体硬盘类型而定 
    1B-1C 
     保留 
       
    1D-1E 
     C盘柱体数 
     1D-2CH只有当硬盘为用户自定义类型时起作用 
    1F 
     C盘面数 
       
    20-21 
     C盘WP 
       
    22-23 
     C盘LZ 
       
    24 
     C盘每柱扇区 
       
    25-26 
     D盘柱体数 
       
    27 
     D盘面数 
       
    28-29 
     D盘WP 
       
    2A-2B 
     D盘LZ 
       
    2C 
     D盘每柱扇区 
       
    2D 
     保留 
       
    2E-2F 
     校验和 
     为10-2DH共30个字节的和数,2EH为高位,2FH为低位 
    30-31 
     扩展内存 
       
    32 
     日期的世纪数 
     BCD码的世纪值,如1995年的世纪数为19 
    33 
     标志信息 
       
    34-3F 
     保留 
       
                    *地址栏均为16进制表示 
    二、读写CMOS内存的方法 
    CMOS内存的地址口和数据口的口地址分别为70H和71H。在对CMOS内存进行写操作时,首先 
    将要写入的CMOS内存的地址送到口地址70H,&127;再将要写入的数据送口地址71H。在对 
    CMOS内存进行读操作时,首先将要读出的CMOS内存的地址送到口地址70H,再从口地址71H 
    读出数据到AL寄存器。 
    三、程序设计与使用 
    为了方便系统信息丢失后CMOS信息的恢复,作者用BORLAND PASCAL&127;设计了一个CMOS 
    .PAS的程序,它可以将CMOS内存中的信息直接写入文件,也可以把文件中的信息写入CMOS 
    内存,同时可以对CMOS内存中的信息进行编辑修改,并重新写回CMOS内存。它不仅解决了 
    没有SETUP程序的计算机在加电时不能设置CMOS内存的问题,同时解决了CMOS信息的保存 
    和恢复问题,是广大计算机用户的一个好帮手。 
    该程序的使用很简单,在DOS提示符下打CMOS,即显示该程序的使用方法,&127;具体使用 
    方法是: 
    CMOS [/开关] 
    开关有3个: 
    R --- 读取CMOS内存信息,并将其存入CMOS.DAT的文件,共占64个字节。 
    W --- 从CMOS.DAT中读取信息,并将其写入CMOS内存。&127;注意这样写入的CMOS信息,其 
    时间和日期是不正确的,写完之后应当用DOS命令DATE和TIME&127;设置正确的日期和时间 
    。 
    M --- 从CMOS中读取当前信息,进行修改,然后将其写入CMOS内存和CMOS.DAT的文件。 
    四、程序清单 
    由于篇幅的限制,程序中略去了用TURBO &127;VISION&127;编写的程序界面部分。 
    program CMOS; 
    type 
    TCMOSType = record 
        Seconds : byte; 
        SecondAlarm : byte; 
        Minutes : byte; 
        MinuteAlarm : byte; 
        Hours : byte; 
        HourAlarm : byte; 
        DayOfWeek : byte; 
        DayOfMonth : byte; 
        Month : byte; 
        Year : byte; 
        StatusRegA : byte; 
        StatusRegB : byte; 
        StatusRegC : byte; 
        StatusRegD : byte; 
        DiagStatus : Byte; 
        ShutDownStatus : Byte; 
        FloppyDrive : byte; 
        Reserved1 : byte; 
        FixedDrive : Byte; 
        Reserved2 : byte; 
        Equipment : byte; 
        RAM : word; 
        XMS : word; 
        FixedDriveType1 : byte; 
        FixedDriveType2 : byte; 
        Reserved3 : word; 
        Cylinder1 : word; 
        Head1 : byte; 
        WP1 : word; 
        LZ1 : word; 
        Sector1 : byte; 
        Cylinder2 : word; 
        Head2 : byte; 
        WP2 : word; 
        LZ2 : word; 
        Sector2 : byte; 
        Sys : byte; 
        CheckSum : word; 
        XMS1 : word; 
        DateCentury : byte; 
        InfoFlags : byte; 
        Reserved4: array[1..12] of byte; 
    end; 
    TByte64 = array[1..64] of byte; 
    TCMOS = object 
        CMOSRec : TCMOSType; 
        procedure ReadCMOS; 
        procedure WriteCMOS; 
        procedure DisplayCMOS; 
        procedure ModifyCMOS; 
        procedure ReadFile; 
        procedure WriteFile; 
    end; 
    procedure TCMOS.ReadFile; 
    var 
        f1 : file; 
        data : tbyte64 absolute CMOSRec; 
        ch : char; 
    begin 
        write('Please input the drive name (A/B/C/D): '); 
        readln(ch); 
        assign(f1,ch+':\CMOS.DAT'); 
        reset(f1,1); 
        blockread(f1,data,sizeof(data)); 
        close(f1); 
    end; 
    procedure TCMOS.WriteFile; 
    var 
        f1:file; 
        data : tbyte64 absolute CMOSRec; 
        ch : char; 
    begin 
        write('Please input the drive name (A/B/C/D): '); 
        readln(ch); 
        assign(f1,ch+':\CMOS.DAT'); 
        rewrite(f1,1); 
        blockwrite(f1,data,sizeof(data)); 
        close(f1); 
    end; 
    procedure TCMOS.ReadCMOS; 
    begin 
    asm 
    les di,self 
    add di,CMOSRec 
    MOV CX,40H 
    MOV AH,0H 
    MOV BX,0 
    @1: 
    MOV DX,70H 
    MOV AL,AH 
    OUT DX,AL 
    INC DX 
    in AL,dx 
    MOV BYTE PTR es:[di+BX],al 
    INC AH 
    INC BX 
    DEC CX 
    JNZ @1 
    end; 
    end; 
    procedure TCMOS.WriteCMOS; 
    begin 
    asm 
    les di,self 
    add di,CMOSRec 
    MOV CX,40H 
    MOV AH,0H 
    MOV BX,0 
    @1: 
    MOV DX,70H 
    MOV AL,AH 
    OUT DX,AL 
    MOV AL,BYTE PTR es:[di+BX] 
    INC DX 
    OUT DX,AL 
    INC AH 
    INC BX 
    DEC CX 
    JNZ @1 
    end; 
    end; 
    procedure TCMOS.DisplayCMOS; 
    var 
    hd1,hd2,fd1,fd2 : byte; 
    begin 
    Writeln(^J^M'CMOS RAM information:'); 
    writeln('Date(MM-DD-YY): ',CMOSRec.Month shr 4,CMOSRec.Month and $f, 
    '-',CMOSRec.DayOfMonth shr 4,CMOSRec.DayOfMonth and $f, 
    '-',CMOSRec.Year shr 4,CMOSRec.Year and $f); 
    writeln('Time(HH:MM:SS): ',CMOSRec.Hours shr 4,CMOSRec.Hours and $f, 
    ':',CMOSRec.Minutes shr 4,CMOSRec.Minutes and $f, 
    ':',CMOSRec.Seconds shr 4,CMOSRec.Seconds and $f); 
    writeln('Conventional Memory: ',CMOSRec.Ram,'KB'); 
    writeln('Extended Memory: ',CMOSRec.XMS,'KB'); 
    hd2 := CMOSRec.FixedDrive and $f; 
    hd1 := CMOSRec.FixedDrive shr 4; 
    if (hd1 <> 0) then 
    begin 
    writeln('Fixed Drive 1: ',CMOSRec.FixedDriveType1); 
    writeln(' Cylinder : ',CMOSRec.Cylinder1); 
    writeln(' Head : ',CMOSRec.Head1); 
    writeln(' Sector: ',CMOSRec.Sector1); 
    writeln(' LZ: ',CMOSRec.LZ1); 
    writeln(' WP: ',CMOSRec.WP1); 
    end; 
    if (hd2 <> 0) then 
    begin 
    writeln('Fixed Drive 2: ',CMOSRec.FixedDriveType2); 
    writeln(' Cylinder : ',CMOSRec.Cylinder2); 
    writeln(' Head : ',CMOSRec.Head2); 
    writeln(' Sector: ',CMOSRec.Sector2); 
    writeln(' LZ: ',CMOSRec.LZ2); 
    writeln(' WP: ',CMOSRec.WP2); 
    end; 
    fd2 := CMOSRec.FloppyDrive and $f; 
    fd1 := CMOSRec.FloppyDrive shr 4; 
    if (fd1 <> 0) then 
    begin 
    write('Floppy Drive 1 : '); 
    case fd1 of 
    1 : writeln('360KB 5.25'''); 
    2 : writeln('1.2MB 5.25'''); 
    4 : writeln('1.44MB 3.5'''); 
    6 : writeln('720KB 3.5'''); 
    end; 
    end ; 
    if (fd2 <> 0) then 
    begin 
    write('Floppy Drive 2 : '); 
    case fd2 of 
    1 : writeln('360KB 5.25'''); 
    2 : writeln('1.2MB 5.25'''); 
    4 : writeln('1.44MB 3.5'''); 
    6 : writeln('720KB 3.5'''); 
    end; 
    end; 
    end; 
    procedure TCMOS.ModifyCMOS; 
    var 
    hd1,hd2,fd1,fd2 : byte; 
    data : tbyte64 absolute CMOSRec; 
    i : word; 
    begin 
    Writeln('Please inpu 
      

  2.   

    程序应该是bp7的需要加入turbo vison