求 通过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++怎么来完成这些步骤呢?求热心人帮我写一个完整的代码
谢谢 你在这里获取的只是DMI的信息,如果BIOS没有放在这里的话,就无法拿到DMI信息。
正确做法是从内存最高端向下512个字节才是你要的东西,如果是在DOS下的话,就要开4G访问模式。
至于如何实现,可以问google 楼主是做软件的么? 觉得汇编比较好写,贴一个:
.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不是在这个地方的. 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计算,不过是十六进制的 原帖由 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芯片参数最好 只是 在F0000h-FFFFFh搜索而已,这是smBios范围.而并未指定 其地址在F0000h处.
页:
[1]