longze 发表于 2008-3-29 08:17:15

求 通过SMBIOS获得BIOS大小 代码

我在debug里的步骤:
-s f000:0 ffff'SM'
F000:BFB1
-d f000:bfb0
F000:BFB05F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
F000:BFC05F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
F000:BFD0C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
F000:BFE09C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
F000:BFF073 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
F000:C00060 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.
F000:C010F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V
F000:C02051 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
-d f000:06f0
F000:06F000 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................
F000:070000 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American
F000:071020 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
F000:072000 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2
F000:073030 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u
F000:07406F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...
F000:075053 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
F000:076072 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ


我要读出这里的06f9:07
然后得到一个(07+1)*64=512 这样来获取BIOS大小-

用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
谢谢

amty.wang 发表于 2008-4-1 12:56:39

你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
至于如何实现,可以问google

bini 发表于 2008-4-1 13:23:53

楼主是做软件的么?

xtdumpling 发表于 2008-4-1 21:31:37

觉得汇编比较好写,贴一个:
.model small
.386
.data
    SMBIOS_Sign db '_SM_'
.code
start:
    mov ax, seg SMBIOS_Sign
    mov es, ax
    mov ax, 0f000h
    mov ds, ax
    mov si, 0
    mov cx, 04000h
    cld
@@:
    lodsd
    dec cx
    jzshort @F
    cmp eax,dword ptr es:
    jnz short @B
@@:
    orcx, cx
    jzshort @exit
    add si, 14h
    mov ax, ds:
    add ax, 09h
    mov di, ax
    xor bx, bx
    mov bl, ds:
    inc bl
    shl bx,6
@exit:
    mov ah,4ch
    int 21h
end start
cseg ends
推测你的算法是:
1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
2.找到这个offset2+9的地方的值
3.此值加一,乘以64为BIOS Size,在bx中.
不过我的机器上,BIOS Size不是在这个地方的.

coolsun 发表于 2009-2-12 17:29:22

DATAS SEGMENT
    ;此处输入数据段代码
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
.486
START:
    MOV AX,0f000h
    MOV DS,AX
    ;此处输入代码段代码
    mov si,0
   last:
    mov eax,
    cmp eax,5f4d535fh
    je over
    add si,10h
    jmp last
   
    over:
    add si,18h
    mov eax,
    mov si,ax
    add si,9
    mov ax,
    add al,1
    mov bl,64
    mul bl
    mov bx,ax
   
    call display
    MOV AH,4CH
    INT 21H
   
    display proc near
   push ax
   push bx
   push cx
   mov ch,4
rotate:mov cl,4
   rol bx,cl
   mov al,bl
   and al,0fh
   add al,30h
   cmp al,3ah
   jl printit
   add al,7h
printit:
mov dl,al
mov ah,2
int 21h
dec ch
jnz rotate
mov dl,20h
mov ah,2h
int 21h
pop cx
pop bx
pop ax
ret
display endp

CODES ENDS
    END START

运行此程序可显示ROM大小.单位以K计算,不过是十六进制的

qdk0901 发表于 2009-2-14 22:19:38

原帖由 coolsun
DATAS SEGMENT
    ;此处输入数据段代码
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
.486
START:
    MOV AX,0f000h
    MOV DS,AX ...
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。

还是直接读rom芯片参数最好

coolsun 发表于 2009-2-16 17:13:15

只是 在F0000h-FFFFFh搜索而已,这是smBios范围.而并未指定 其地址在F0000h处.
页: [1]
查看完整版本: 求 通过SMBIOS获得BIOS大小 代码