找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 13678|回复: 6

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:- e0 k. K& n6 X5 e5 m: X
-s f000:0 ffff'SM'8 [3 P7 b/ c8 p( ~
F000:BFB14 @6 n$ G8 p2 f0 Z" N, h& {7 p& I. d3 |
-d f000:bfb0
0 J1 M/ ?( ^+ Z4 H$ B  E0 IF000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............
' W% }, t& F$ \; u1 }F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
- }+ f: K) e' x$ }& T# w5 ~& V3 qF000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................: N9 e) w' }, \
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
! c% J  j& O; z0 `9 cF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......3 ~5 k" Q" D9 C/ N* G5 W2 q
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.: N' \7 g. }8 E, Z- ]9 n  H- Y0 R
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V
# J" U5 n4 n+ A% G+ _F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..
4 d/ G' O; s8 v* q$ f( a& G: p# `! A-d f000:06f0
, o4 @% c' q, W! D: z, w# F5 XF000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................8 l3 k7 y7 k3 v8 g# i  x( C% w
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American, q6 m+ Z# @# m- g0 y+ ?! o8 V/ ~, I
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.& p4 c0 p9 r6 z7 Q" Q6 L2 A
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/20 v  j7 U& U+ v. i+ b' Q! c; q% o
F000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u, p, O# ~* |; G* T+ L  D9 A
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...& g) O& M' g7 c) ~
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu5 a: ~/ i+ ~3 J  d  _, p( R  b2 m( d$ X; s
F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ' r  [, ?6 |& }. h6 t
, a- b7 D8 b5 \% P( |

' N5 c* f; |' K- z5 {! k我要读出这里的06f9:07
& F  e! E! q. E, t 然后得到一个(07+1)*64=512 这样来获取BIOS大小-0 g5 v/ S  w# v

# V! P7 g  K9 Q# Q* t: G用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码! q. i% J' i) o1 A8 b0 R3 d
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。# a  ]  o2 U% A+ y4 \6 Q
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
" n2 _* Z2 `7 q- @) o至于如何实现,可以问google
回复

使用道具 举报

发表于 2008-4-1 13:23:53 | 显示全部楼层
楼主是做软件的么?
回复

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:
. f' q+ N% j6 a$ d.model small* g7 G% V( T/ X
.386* m; L3 H5 J, t+ L$ O
.data( [& f) P* w" v$ M6 j8 N. ]" n
    SMBIOS_Sign db '_SM_'# w/ z$ z# S0 Q7 _; ^( q5 {2 ?* y/ [
.code" R! s) k; A# D2 R% _
start:
! `6 L+ B4 y: M) D    mov ax, seg SMBIOS_Sign1 k% F2 Y/ I# \# t. d- N
    mov es, ax
7 C" {, V' U( j' `# K* }$ d# Z    mov ax, 0f000h
* R6 `$ k" c9 F; _/ S9 B    mov ds, ax
3 U: X/ V* @2 ]: f    mov si, 06 w) w! I- _+ A$ C2 @+ V: c& A7 _
    mov cx, 04000h
6 }$ x% m( q! m1 n- j# R    cld2 S/ ]  ]( r: p2 _/ Q
@@:0 i! D& O* w3 a8 E; H7 o  f
    lodsd* h+ h- c2 d" {( ^; Y
    dec cx
1 u- Z- Y6 V( a$ T    jz  short @F. |# O6 n1 p0 G
    cmp eax,dword ptr es:[SMBIOS_Sign]
# U2 }: A* i5 b+ B8 Z  n- C    jnz short @B
* X3 _0 {6 H  }$ A2 F' |@@:
) B& u3 o8 d2 j7 }6 X, x3 e    or  cx, cx
7 W3 Y* `7 B, w! x- N  @8 }    jz  short @exit
8 d0 E1 t% r7 R$ v! o9 Z    add si, 14h: s5 a6 T: U, X9 s8 N4 Y4 \
    mov ax, ds:[si]1 k1 ?( p6 s; L0 k( {; I' M
    add ax, 09h
: B0 `$ M3 |: r8 h- B7 c4 C    mov di, ax, s1 i2 m1 S, M
    xor bx, bx
- o; v: |! Z, B2 t    mov bl, ds:[di]
: q2 q* I( x6 H( ~, n    inc bl
0 v* k' [& h/ v& R; [& W  A    shl bx,67 S- |/ Y5 E; `( \: N3 G4 ~
@exit:
3 f  C/ U+ V1 t$ w5 Y    mov ah,4ch' Q8 s# a4 M8 K6 v9 g6 O
    int 21h
- q# Y- ^5 T+ J# }end start
9 w" ?# B2 [" R( x- Ecseg ends4 J; n) k) D: z% ]1 ^2 V" P5 [
推测你的算法是:! |8 [2 x+ Y; l2 ^
1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
4 e' W* E6 y0 s# n6 E* ]5 r) {  L2.找到这个offset2+9的地方的值  @# p- w; D, Q& D
3.此值加一,乘以64为BIOS Size,在bx中.
/ u/ J& |; z: k不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT
2 X, e0 R% e7 _' c    ;此处输入数据段代码  
/ Y9 l" C1 p5 X% F; `DATAS ENDS
( p* G! M" ]  l4 a( Y
: [: P4 w& n) e4 y" q" W0 W3 C6 |; @, sSTACKS SEGMENT, X6 C7 t+ |! V" i; S. q* g% ~
    ;此处输入堆栈段代码2 y* x! A$ r. R1 b. C
STACKS ENDS$ }8 ^& a5 S, D" Y

& y! W- X8 z( }& B1 x2 t# a; eCODES SEGMENT4 s( a- R# i: r' ^$ S6 t
    ASSUME CS:CODES,DSATAS,SS:STACKS5 t# O) n/ D. R: l/ ?
.486) g1 [  ?( R' ^9 W" B
START:
6 P5 G, X* |- W+ F* D1 V/ J/ k  D/ e    MOV AX,0f000h$ m/ ^0 z* T6 l% y" D" D% K* K" b
    MOV DS,AX3 r% D6 C; f* f7 _' V
    ;此处输入代码段代码
0 l9 f' U3 u4 {: }! c$ r7 S    mov si,0
( W, e1 K$ B$ C' Y6 }2 A   last:
3 i; e: H4 K) A& z# |( Y; Y2 d2 p    mov eax,[si]
; z( X) A; S0 Q4 B  Q  f& h* Y    cmp eax,5f4d535fh1 V$ j' k# z' R3 T+ _/ L# d
    je over0 N$ ^2 ^. Q0 a  ~# o
    add si,10h$ w9 o3 @# j3 |
    jmp last6 S5 D+ t% S8 q+ w
   
4 `  ~- [' k2 R$ n3 N/ h/ U    over:
5 n$ y8 }6 L9 T2 k% Q& F  g    add si,18h: J9 O4 T: U" K
    mov eax,[si]4 i, Z; B& L8 h+ e4 d, u9 B+ ]
    mov si,ax+ n. @) j3 K; h
    add si,9: Y8 a: S: t4 F  A5 L) R  j# k/ o1 w
    mov ax,[si]
6 [$ C$ _; L$ l  Z$ p    add al,1" g8 k7 H  G" q# N9 P. }# P) k. l1 }
    mov bl,648 x7 }  @5 h9 K
    mul bl
0 ~9 h. g  u+ Y9 O    mov bx,ax
0 f1 R0 H, f' ^4 R" k   # ^$ n: b. Y8 M
    call display7 ^0 G( S7 _( s! {  g) {" u0 l
    MOV AH,4CH5 @+ \5 `  n9 Z+ M
    INT 21H  # w' Q5 H; `! m4 |( j
    . t# o  V9 @3 X: G3 [) z( l9 d
    display proc near
' X  d0 W' R- x   push ax
$ f& |6 k. K; ?0 e. q8 w) T   push bx
/ u) M4 g: E$ R, T5 X. R7 c   push cx
1 @# x1 q5 z# B) b3 j+ ~8 N1 I   mov ch,4
3 {8 g! \4 @9 l4 L4 T* i  rotate:mov cl,40 d. [) s1 _4 x7 \6 L- b4 ~7 O
   rol bx,cl" I$ c! J1 j5 m8 C  s
   mov al,bl
6 v3 M$ N3 z+ ~2 E* t/ c9 n- n   and al,0fh
! c: V/ f1 X1 H9 o/ v6 i2 {7 o# C   add al,30h
& T3 Z6 c* l- z0 Y* n" Y: \3 s: c   cmp al,3ah
. V* w6 p- C& f9 @   jl printit
6 \; u* W3 I0 U2 N1 {   add al,7h
/ b7 L3 n# q* C6 f  printit:
% ?' _& K5 [4 W  F# Z  mov dl,al
/ Q7 g$ y4 }/ i+ i# i- \/ f6 E  mov ah,2) _% p) j5 E* }1 H- k
  int 21h
1 t3 O5 [1 [, @4 q  dec ch
4 M0 d. P! B  g1 N. X0 i  jnz rotate
8 c+ e( q& }7 R- O  mov dl,20h
( X; n4 w, T& P( v* E  mov ah,2h* M/ r: K. D/ g) j2 s. y7 G; M% D1 I5 I
  int 21h, O* v) g4 b: f% k
  pop cx
; z, i+ c. l8 D& U* O0 V  pop bx% G' j1 k0 F- n$ I, z2 e
  pop ax
1 m/ M. @! @6 X/ `- r) g6 p  ret
) h! e( j# s4 i, x" Q( ~; n  display endp2 n% v# v! Q( j
5 g" k* ]* _1 T$ P% u2 P* E. W
CODES ENDS
: \; ^  r) ~$ j! Z4 @    END START
0 v* ~  @5 \& v) [" u0 h0 I( ~/ y' ~! w
运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun$ E8 F: ~$ s& V* \: d
DATAS SEGMENT2 K. u: @+ b, m6 \/ t+ U
    ;此处输入数据段代码  3 j+ I! Z7 \& r& j$ G$ i
DATAS ENDS) t: @3 N4 w& K6 R3 P
0 v# J1 j% b+ J4 u4 R
STACKS SEGMENT
, t" C5 y; W$ T2 G- j  a  d; X    ;此处输入堆栈段代码. {0 H1 T6 R5 |' _
STACKS ENDS
% F1 T) S1 ]( b
5 y  g$ M" o/ h7 G+ kCODES SEGMENT$ I4 @5 p9 e) a$ S' v, z: |; v
    ASSUME CS:CODES,DSATAS,SS:STACKS+ Z% |, S% Y0 \# }1 [  n  Y- k; Y- N
.486
; f3 K3 ?2 Z1 M5 vSTART:, T4 Q6 N5 z4 h& |4 R
    MOV AX,0f000h
* C( [& k1 V+ {    MOV DS,AX ...
9 d1 y, [1 m$ q
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。/ ^9 m5 c4 O" f7 \5 @" j( [' o2 Y

, B" F) ]3 s' w6 i$ I" F还是直接读rom芯片参数最好
回复

使用道具 举报

发表于 2009-2-16 17:13:15 | 显示全部楼层
只是 在F0000h-FFFFFh搜索而已,这是smBios范围.而并未指定 其地址在F0000h处.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2026-3-5 16:01 , Processed in 0.066426 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表