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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:2 H2 H8 Y% V7 w# D* }+ {) L
-s f000:0 ffff'SM'  c: E! C; L. E# P) h
F000:BFB1& I! I# ]' p2 v
-d f000:bfb0! O' R" \+ U3 L
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............# Z! k5 ~7 H% {6 N' U9 V' g
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...- ^5 r6 b3 X' `, n  b! s7 t" V
F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................, `; Z6 a! r, V6 a5 J3 g7 o
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
8 l3 [: {  }' R. A( DF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......" I7 F" ^% C4 F* J$ H+ V/ V
F000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.
+ @1 C+ R3 C5 L7 }0 zF000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V
; S" x$ d- i( @& X, ^F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^... R; _( K% v! F3 P$ M9 h, Z9 {
-d f000:06f0
2 b, q" F' e8 H; u9 UF000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................4 ?$ ]+ _4 Q' \* S
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American
3 X+ R3 R  E" i9 {5 Q) @# w* p$ f2 |F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.$ v4 K4 l; i; P7 G
F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2
  ]4 y* a- I$ l' P. L' @, HF000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u0 c3 }* M# n. a, W' `' E: q
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...! ]8 k* ^& W  `) V, C
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
( I' e4 T* d" n5 ~( e" e! }. }F000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ
, X# y6 p6 b; o) A0 Z7 o
  A5 i2 n0 M. B8 {# |
4 F: j- \! u( t# i" V我要读出这里的06f9:077 Q5 A/ n8 Q) W4 J* h  q  o: y/ V0 m
然后得到一个(07+1)*64=512 这样来获取BIOS大小-
* k( h7 m/ W" q; T* G! p% k2 c* q, y6 m1 |. @
用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码8 f9 H4 j- b6 K. l* W
谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
. k* J3 V2 T5 D4 l) K9 H正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。! h1 t* E3 `# s3 K1 I3 ~, C
至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:2 u/ r9 s. u5 w
.model small3 J% `5 b( [# _5 O  W; @+ q
.386) c; K% k6 d; I' J; Y
.data
0 O- `: S2 g3 A% V/ P0 ]    SMBIOS_Sign db '_SM_'5 T4 Z: H) x5 k$ R
.code
& n; q+ `1 u: P( Zstart:
( w; q, L+ b" C7 P4 O    mov ax, seg SMBIOS_Sign' Z8 f8 v  u, S" K0 p
    mov es, ax; z" p+ s8 r+ H2 V
    mov ax, 0f000h
4 p0 U& x2 V) X/ k: P    mov ds, ax
7 b, K/ f2 O1 E) X- h/ j. |+ [" O    mov si, 0: E3 e  T3 [9 ]" }5 z
    mov cx, 04000h5 u- Y) J% o, q/ L* z
    cld
/ s0 _" ~& Z  q& ?@@:' l. N4 t% F& O. D
    lodsd1 e9 ^: J% L2 I9 q
    dec cx
/ Y1 F* y7 I6 }6 h) Z6 A    jz  short @F
+ _& u  V2 [  e3 k, F, h" E' @    cmp eax,dword ptr es:[SMBIOS_Sign]! m3 x7 l3 a" q% G) A5 t% D: Z, u
    jnz short @B
" y9 W& z$ X; I" @" N@@:7 L! ]' y' V5 p& y$ A
    or  cx, cx
8 L" ^" t: h% G/ B0 H: I& h* N- C    jz  short @exit
3 A& z" x2 e) [( d8 L; p+ x) y    add si, 14h
# l6 k/ T2 {1 c! _7 g    mov ax, ds:[si]  B4 t" k$ m# {4 S+ Y7 [
    add ax, 09h& h4 N" z! j8 [0 V
    mov di, ax
0 r+ |& H! W3 |* A$ f    xor bx, bx. [: w+ v( A$ c2 A
    mov bl, ds:[di]% _0 V! c. q: J# e
    inc bl
$ k* E! Q# ?1 V8 j1 R% O6 ^5 ]& a    shl bx,6
9 T1 D' C, u2 H8 G: z% l: U@exit:
! g- K3 x! Y; J8 Y! k    mov ah,4ch
3 K& V+ N) ~) X' y6 w4 C    int 21h
5 k; K$ h( B9 ~* ?end start. H1 N* R$ V! ^7 A* t
cseg ends: ]/ k5 I9 r6 l- @
推测你的算法是:& `( v' T+ q7 ^# J) j) x
1.找'_SM_',然后在其后offset 18h的地方为下一个offset2$ r. E- N* {8 V/ n5 C
2.找到这个offset2+9的地方的值$ [6 a' V& r: J- ?5 e" Z* f. U8 @+ k
3.此值加一,乘以64为BIOS Size,在bx中.+ s, b# Q( Y/ n: U
不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT- r* `6 o2 J$ B9 i6 P/ @. C. i$ r& m
    ;此处输入数据段代码  : m1 i8 q) h: ]# b  Y- e" z6 F+ ^/ M
DATAS ENDS- y8 Q7 D7 X$ _, l

) G" N$ q; K" u! z5 i% GSTACKS SEGMENT
: R5 \2 h! x5 J; l/ F) d2 {9 M    ;此处输入堆栈段代码3 n  h6 R; V6 O# F/ P; i
STACKS ENDS
4 b/ D5 w8 E! [1 V5 P% D0 X" s/ E
CODES SEGMENT
5 b  E% D; O7 I2 V    ASSUME CS:CODES,DSATAS,SS:STACKS
9 t  B% z: R' N. N.486
" R; T9 d9 `8 p8 ESTART:
! X' q, {3 q+ J    MOV AX,0f000h
3 Y* O8 C6 p' [* h/ X+ ?    MOV DS,AX! {# L$ z+ p* j4 l
    ;此处输入代码段代码
, a8 G4 w* H4 Q8 e/ d8 D( g3 I% W" D    mov si,0
4 L) a) h- q1 N: w6 @   last: - [/ g# G3 f0 A
    mov eax,[si]
& o6 s( P9 R& |/ s" Q8 X    cmp eax,5f4d535fh1 o( o1 D- S5 V7 n- A( r
    je over2 x4 I+ b0 c: P5 r$ A  Z; K9 z
    add si,10h) u% K* r$ t7 H( h
    jmp last
8 x' Y0 C' Y% ^& s* X4 I   
" G6 D. z2 V8 A2 J3 x/ @! j    over:
7 N' r) u" O# s$ ?) `7 V    add si,18h
% X% m+ L6 E! g0 }    mov eax,[si]* T$ x& p8 y3 i
    mov si,ax
* x' {0 U  p4 ^    add si,9$ y& O" ~8 W$ {* K
    mov ax,[si]
* z. A4 w# a/ n7 G3 c3 v4 n8 Q+ Q    add al,1
2 _9 E! ]' }2 Y7 _) F+ o. n    mov bl,64
' I7 E6 G. o# J. S! d' m1 X( F    mul bl
& m% U1 K# V4 n# o7 F) C# @    mov bx,ax
* ^( h5 X+ x8 X5 c9 a- h   * z- u+ [! P* P. ^" R, ?3 _5 K8 U
    call display
; j+ a$ V8 T! \0 Q    MOV AH,4CH
. m% [% C( w7 o0 ~5 w    INT 21H  
& B% }2 R! v0 u$ ]6 D    & o" ?" K3 o; B. h
    display proc near. P2 o: Z8 v% r  ^
   push ax" n3 d: p% I6 ?7 U& `% N. m/ C# O3 f
   push bx
/ ^  a  X5 |- o' V! H) o   push cx
4 g0 S, x1 `/ l$ y* n7 \8 g& i. C   mov ch,4
' B: h  p# @" W5 f  rotate:mov cl,4+ r; f1 ]2 a, M& N  q% ^
   rol bx,cl' Q' y5 G/ r$ e
   mov al,bl% H! M7 N( i) {0 k$ q8 h
   and al,0fh$ S3 u) t, b  ]
   add al,30h/ p' _3 x( E$ u( u
   cmp al,3ah& C5 _/ I7 r8 R7 o. Q3 x1 l/ u
   jl printit
8 s' ~* x# ?  b8 ~+ m: a0 ^   add al,7h
: w; \+ `: {. c3 v% k; Z2 k& i  printit:- I. {" u4 w: O& G
  mov dl,al
/ a; J' f" F) o! ?  mov ah,2( Y/ Z" L/ j6 b5 u) `
  int 21h
- K1 U, v8 i! h  dec ch. ?$ D" w! @; |* ]* R( X- g/ {
  jnz rotate
# @$ X  E  O6 Q2 q  mov dl,20h
  `/ \) U* X+ }2 X/ V0 |" `3 S9 }9 c  mov ah,2h+ {5 t+ O# ]$ J' }
  int 21h  O+ Y2 p/ c! x. X4 I# l
  pop cx! c( d# Z+ w, Y+ ~
  pop bx
8 i4 F0 b1 @( c0 P: D2 O# Q/ A  pop ax! v6 E% N5 M+ O6 t: u  y. a
  ret
/ K0 b9 |8 c, _  display endp
3 u& a$ c( E. ]* n, B2 [* w; Q( V- ]0 |4 v' c) E" v+ A- b! N7 k2 `. C  E
CODES ENDS
7 G; l+ `; R. _% t6 F    END START8 C4 S5 ]; q, L( L- d5 U

9 e3 ~3 w* U; E6 {运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun% j8 B' Z7 h% }& Q. G
DATAS SEGMENT+ F' v; f( `# S9 ]
    ;此处输入数据段代码  ' G. g; m: y0 _# ~- g* J
DATAS ENDS
+ _2 H" u* B( N* J5 G+ M
7 [" L% g% {8 D* wSTACKS SEGMENT/ x, h( B: n& Y7 A
    ;此处输入堆栈段代码5 I- W1 _3 G: j7 v- C
STACKS ENDS
# U( h( S; h" m/ g, {" O4 X. F; r6 s% j
CODES SEGMENT8 @7 ^* u5 G) B' x
    ASSUME CS:CODES,DSATAS,SS:STACKS3 t9 _: g* _/ I' _
.486
- N) j  [' G" l& G% |8 q- xSTART:
- F' p, f% @! {  g    MOV AX,0f000h
. r& F" k4 H3 O' Z/ J6 p2 y    MOV DS,AX ...
9 B; k) V. {# e" \! U% K
二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。
- O  q% O- _2 K$ w2 N4 B  Y5 J' k" w# `! _
还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-29 04:05 , Processed in 0.098467 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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