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

求 通过SMBIOS获得BIOS大小 代码

[复制链接]
发表于 2008-3-29 08:17:15 | 显示全部楼层 |阅读模式
我在debug里的步骤:
% n. O$ B9 n( F- W+ Z: f; _5 `; P-s f000:0 ffff'SM'
/ ^9 p; W& r& q- n" k' \F000:BFB1. U/ x& H; a& H
-d f000:bfb00 R1 ]/ V* z' a. r% P& [, D( l  A- M
F000:BFB0  5F 53 4D 5F C7 1F 02 04-B6 00 00 00 00 00 00 00   _SM_............- |5 N* c' D: k! ?1 {4 y
F000:BFC0  5F 44 4D 49 5F 08 23 07-F0 06 0F 00 31 00 00 9E   _DMI_.#.....1...
( L5 g9 _$ H0 j& G0 }F000:BFD0  C7 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................1 R, N4 ~& c3 x
F000:BFE0  9C 53 67 8B 5D 00 83 EB-50 B8 81 00 81 FB 05 00   .Sg.]...P.......
8 ?" u& x. ~2 r! M! l6 lF000:BFF0  73 07 D1 E3 2E FF 97 8D-C0 5B 9D CB E8 01 00 CB   s........[......
) J9 w1 G1 I$ E8 {+ |! }3 _& sF000:C000  60 8A 04 E8 49 00 72 44-E3 3F F6 C5 80 74 2D 80   `...I.rD.?...t-.& W+ F( o6 s# s; M; _
F000:C010  F9 01 75 38 0F B6 08 26-3A 09 75 30 E3 2B 1E 56   ..u8...&:.u0.+.V5 O% q/ u1 G7 |0 p$ q# W
F000:C020  51 06 1F 8B F7 E8 2D 06-8B FE 8B D1 59 5E 1F E8   Q.....-.....Y^..7 T6 C) V9 @" H5 }
-d f000:06f0
" q- j* i/ x/ qF000:06F0  00 18 00 00 01 02 00 F0-03 07 90 DE 8B 7F 01 00   ................" U$ A0 i% U: u+ j# B* g
F000:0700  00 00 33 05 08 0C FF FF-41 6D 65 72 69 63 61 6E   ..3.....American$ ?5 r3 |8 c! y$ a! w
F000:0710  20 4D 65 67 61 74 72 65-6E 64 73 20 49 6E 63 2E    Megatrends Inc.
& {* U9 b3 u. V5 G0 {F000:0720  00 30 32 30 31 20 20 20-00 30 35 2F 30 31 2F 32   .0201   .05/01/2
1 Q  P) U2 }/ a8 p4 _- lF000:0730  30 30 37 00 00 01 1B 01-00 01 02 03 04 A0 08 75   007............u! Y0 z1 ~, o0 [; P' l6 B1 K
F000:0740  6F 8D FE D5 11 A0 90 00-1B FC A0 07 38 06 05 06   o...........8...0 h3 C1 s6 w: \/ \/ _+ U
F000:0750  53 79 73 74 65 6D 20 6D-61 6E 75 66 61 63 74 75   System manufactu
9 k( @4 m. H% `% t0 QF000:0760  72 65 72 00 53 79 73 74-65 6D 20 50 72 6F 64 75   rer.System Produ  N# q! o' F1 ^7 y+ o' K

( _. A% V* E, |; g4 d, y
2 C, u% h3 c% r) T. o0 c我要读出这里的06f9:07
) a# X& J1 b  R  Y# y) ]6 ~ 然后得到一个(07+1)*64=512 这样来获取BIOS大小-
  a- k, U; M$ \/ Q
9 I7 X& ]5 G2 g/ u# i; D6 c8 W用c++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
. v! v4 a0 T  w$ U5 C; {# w2 v谢谢
发表于 2008-4-1 12:56:39 | 显示全部楼层
你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。) B( S- f* f, ?' l$ d7 a% F
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
) I/ E4 ?" C. m; M% V4 _) H: T至于如何实现,可以问google
回复

使用道具 举报

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

使用道具 举报

发表于 2008-4-1 21:31:37 | 显示全部楼层
觉得汇编比较好写,贴一个:. k: K  w/ H& q% G7 E/ K
.model small
9 \2 S. M2 d7 a' W9 q# p.386) E1 E8 L1 W" F7 K. `$ |
.data: _% L5 q" C' x' g3 `/ x1 {! L
    SMBIOS_Sign db '_SM_'2 W7 X1 u! O# l: z, ]2 C, S4 D
.code
, y4 E( Q4 V4 {( Hstart:- O- H, [" S) _* M8 b1 q3 B
    mov ax, seg SMBIOS_Sign$ i$ v; D8 a# N1 K# K; `  @, y2 ^
    mov es, ax
2 v, F3 R3 V5 S    mov ax, 0f000h% [) n1 c$ P) V- u  P
    mov ds, ax7 q) K" T" ~: y) k# g
    mov si, 0
* t4 Z* P8 |$ x( q: }* e    mov cx, 04000h
1 _; q, z6 `/ k  |6 }    cld
! p( z, |4 C9 i" I@@:, M* }3 b& r7 m" k4 l
    lodsd
3 s6 g( ]; q& h6 L$ e    dec cx
) Y) d5 |' O* O; N" n! _    jz  short @F5 @, w' h* Z! ^# T0 _4 C8 Y
    cmp eax,dword ptr es:[SMBIOS_Sign]& |- q9 d/ W8 S
    jnz short @B" I" s; y  y$ [0 b
@@:% d( D) F, E& P; e: g9 g" f4 {
    or  cx, cx
5 _2 \. M: k  W3 I0 x$ p    jz  short @exit" f+ ]5 t8 z) Q; ?! G- M( O
    add si, 14h
# U* [9 N$ L- P* A6 P3 `' o+ f    mov ax, ds:[si]
+ L, I1 e) P, ]3 `/ f/ n, n3 J  n    add ax, 09h0 a: G/ I; C, n  x. r. R
    mov di, ax
5 B+ E* }$ R- c5 ]    xor bx, bx6 ]) G; b& P/ P  T# p: e& Q- J
    mov bl, ds:[di]
4 R# a' @0 d; @% i5 v5 d1 Y% K) \    inc bl. _. b3 _7 H, c, D+ r" O7 A* D3 ?1 C
    shl bx,6
9 H9 ]+ ]: A: |4 u" E$ j  o7 F/ G@exit:4 B/ p. U1 \2 \: L) N
    mov ah,4ch
# d0 X( w% K4 o3 h    int 21h
7 [' L* E/ [# B% b$ Z% aend start7 h% R5 \# T* R3 f9 {- R
cseg ends7 ]5 _7 ]8 V  H' I. }8 w" _
推测你的算法是:' m9 k8 y! n1 o, F% o1 b
1.找'_SM_',然后在其后offset 18h的地方为下一个offset2
( G* ?: J5 b3 H8 w9 \6 g4 N2.找到这个offset2+9的地方的值
  B' Q& s( z: }3.此值加一,乘以64为BIOS Size,在bx中.
: U( d0 f$ ?9 B: O4 V不过我的机器上,BIOS Size不是在这个地方的.
回复

使用道具 举报

发表于 2009-2-12 17:29:22 | 显示全部楼层
DATAS SEGMENT
5 G( i' \) L4 S/ u& [; C    ;此处输入数据段代码  
/ k2 [3 h& ]# w' P5 sDATAS ENDS
$ G1 H) `* o% k  g
0 w* N, h# V) lSTACKS SEGMENT
( U7 y- K5 n# ^    ;此处输入堆栈段代码* v' F$ N& @" J6 _
STACKS ENDS
, ~4 K5 K, Z$ \' z) C
% V5 d- f9 p& K7 A4 R7 ]CODES SEGMENT
, g% u5 w. m5 u0 h1 Q. {8 u4 S    ASSUME CS:CODES,DSATAS,SS:STACKS
8 F' |4 _5 @0 O( }) X.486
+ \# J) _1 R# _! m4 p" wSTART:+ h- M$ {9 T. _, c# g
    MOV AX,0f000h$ v5 G- I. o; |/ N+ Z
    MOV DS,AX
/ }% G7 m* D! w7 X# f: W    ;此处输入代码段代码
0 Q" C( z. x2 ?9 H- e  d" R( U    mov si,0. q* @0 H9 l6 [+ r
   last: 9 m0 M4 F) B2 h3 Q, v) O) ~
    mov eax,[si]
8 _; z( X( p- W& v" x    cmp eax,5f4d535fh
$ B: b( a  X+ ~    je over
, i9 y# S+ @( K" A3 W    add si,10h
" k: I8 ]9 Y/ N7 K5 t; v' F    jmp last/ Z/ u( R# ?/ D% L/ C- ]  m7 @- o
   
+ Z, y& _4 L: |+ t    over:9 b$ I& x5 Q( R3 X8 \) \5 o
    add si,18h
$ y; p% P* n) N/ B% o* C- Y    mov eax,[si]
9 y$ }7 a" a- D/ s/ c" a    mov si,ax
" n/ u/ F* D  p* K) A8 I    add si,95 D) t% M" @9 L1 F& p6 H
    mov ax,[si]! T" ~( v7 b: s' S
    add al,1
  n' \1 C4 B+ Z, n6 `    mov bl,64
( c& q6 v2 b9 r5 v    mul bl. Z* w- x( m8 W9 j
    mov bx,ax. Y3 |3 A+ w/ I7 Q7 L: U% v
   
! X& X) m( m: J, b2 [5 `( w" ^    call display
& c' a) W; P) h# Y    MOV AH,4CH3 R. H. \0 |8 q0 @0 O# Z; U9 }
    INT 21H    Z: i  t8 U% i7 Z$ _: p
    + Z% I5 @: T2 `& [: {
    display proc near  i% m" r; g- H( \3 y
   push ax8 ~& h! n) a0 u- Q3 O, m4 c
   push bx5 G5 G, m- H6 y
   push cx( Z5 i. q# L9 C* O5 C* d# r
   mov ch,4
& N* r9 P: {0 h* q  rotate:mov cl,43 Q& d. `* f0 `
   rol bx,cl/ O1 h0 m/ E3 K4 n4 X
   mov al,bl* a6 }: b/ s. [& U5 L
   and al,0fh8 y4 z6 m" Z8 l0 R- i4 E
   add al,30h1 l+ A  Z! E: P/ |% X. f
   cmp al,3ah
* O- r; j. D8 n+ U  X: W( r# o2 w  t   jl printit% p9 i  d) H0 p4 a' U
   add al,7h" h' \' c  S+ [, z1 ]
  printit:
7 I  s( _- _- u! p5 J9 l  mov dl,al
9 Z, `1 |- o0 ]" g: c  mov ah,2
( g$ S3 }- a3 J  v- y1 `" {  int 21h& I! Y5 R* _( j0 Y3 G( m
  dec ch5 S8 Z& A2 X9 `: |( l8 M! @, }1 x$ \2 q
  jnz rotate
  }6 O/ P, T" [7 |% e- L  mov dl,20h2 A" I! U6 p+ T8 V
  mov ah,2h
) E+ N! M# k$ o  int 21h
! G; P' {0 r7 m" Q  pop cx
7 v9 _$ H/ i( N( o  pop bx
& {) F; T+ A, q" }: x) {7 B4 Q/ d! X  pop ax
1 }3 z3 t: h8 A' {& v! o5 Y  ret
9 N' Z* n. o  q4 n0 T9 B. C  display endp
1 Z+ f3 l7 u2 a6 o7 b0 M
, N  [) ]2 L& Z# A9 B3 S$ ?CODES ENDS
4 v3 P, M7 o. k3 l    END START0 m4 [; M6 B2 o% s# q9 x
: w# Z6 \1 F' ~# }
运行此程序可显示ROM大小.单位以K计算,不过是十六进制的
回复

使用道具 举报

发表于 2009-2-14 22:19:38 | 显示全部楼层
原帖由 coolsun' g) }* L( W2 X' {) x8 C
DATAS SEGMENT( _. {7 V7 L: f) S
    ;此处输入数据段代码  
, C) y2 C5 |0 X4 B; f- RDATAS ENDS+ _/ c  n1 b$ J, C! K

( N) }6 K: v$ p  c1 p3 F0 KSTACKS SEGMENT& d  S! e& p9 Z, b
    ;此处输入堆栈段代码7 N6 ]+ e& B9 M' X, Q5 S  z
STACKS ENDS, Z9 y1 s! L7 W: @/ [
7 D4 z: Q" g' Z. _1 G/ R
CODES SEGMENT
3 O. ^5 |5 b8 `0 N* ^    ASSUME CS:CODES,DSATAS,SS:STACKS( A% a- M2 l0 t8 F* H$ A& b
.486  q8 ?- |* l1 t' O; y) Y- w9 g
START:9 v! q. {# h* D& x2 U
    MOV AX,0f000h
" Y" A: p; y5 j& L  C( D    MOV DS,AX ...

5 B9 A7 O0 l" [7 L二楼不是说了如果smbios没在这里放bios的大小,这种方式不行吗。$ S6 U2 A4 o9 E# f

; \9 l( m* A' q9 J8 a) |' |% b还是直接读rom芯片参数最好
回复

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-5 15:54 , Processed in 0.092506 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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