Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2012, 15:40   #1
Exitm
 
Регистрация: 04.05.2012
Сообщений: 3
По умолчанию Как узнать дату и версию Bios?

Помогите узнать дату и версию BIOS с помощью Assembler.

Заранее спасибо!
Exitm вне форума Ответить с цитированием
Старый 04.05.2012, 19:26   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Они находятся по адресу FFFF:0
s-andriano вне форума Ответить с цитированием
Старый 04.05.2012, 20:47   #3
Exitm
 
Регистрация: 04.05.2012
Сообщений: 3
По умолчанию

s-andriano, спасибо!
А можно чуть конкретнее (какие прерывания использовать и что в какой регистр помещать)?
Exitm вне форума Ответить с цитированием
Старый 04.05.2012, 21:23   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

если Вас ваша винда к портам пустит, то вот так можно целиком биос прочитать в файл (старый добрый TurboPascal):
Код:
{$A+,B-,D+,E+,F-,G-,I-,L+,N-,O-,P-,Q-,R-,S+,T-,V+,X+}
{$M 16384,0,655360}
const
    DefName = 'bios.$$$';

var f: file;
    i: integer;
    buf : array[0..2] of byte absolute $F000:0;
    Name2,Name : string[80];
    Ext2 : string[4];

procedure ReadByte; assembler;
asm
{процедура чтения байта}
  out 70h,al
  jcxz @m2
@m2: jcxz @m3
@m3: in al,71h
end;

function Read(Addres:byte) : byte; assembler;
asm
  mov al,Addres
  pushf
  cli
  and al,al
  js @m1
  or al,80h
  stc
@m1:
  call ReadByte
  push ax
  jmp  @m5


@m5:
  mov al,0Dh
  jb  @m6
  or al,80h
@m6:
  call ReadByte
  sti
  pop  ax
  popf
end;

procedure Err(MS : string);
begin
  WriteLn(MS); Halt(100)
end;

begin
  WriteLn('Чтение BIOS');
  for I:=0 to 255 do buf[I] := Read(I);
  if ParamCount < 1 then Name := DefName
  else Name := ParamStr(1);
  assign(f,Name);
  rewrite(f,1);
  if IOResult <> 0 then Err('Невозможно создать файл '+Name);
  BlockWrite(f,buf,$ffff);
  if IOResult <> 0 then Err('Ошибка при записи файла '+Name);
  close(f);
  WriteLn('Done.');
end.
Вложения
Тип файла: rar READBIOS.rar (3.3 Кб, 25 просмотров)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.05.2012, 21:41   #5
Exitm
 
Регистрация: 04.05.2012
Сообщений: 3
По умолчанию

Спасибо вам огромное, Serge_Bliznykov!

Попытаюсь разобраться...
Exitm вне форума Ответить с цитированием
Старый 05.05.2012, 10:11   #6
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Sergey_Bliznykov, паскаль может и разрешает обращаться по абсолютному адресу $F000:0 , но вот Delphi разрешает указывать на адрес какой-либо переменной. Как же тогда обратиться по адресу $F000:0?
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 05.05.2012, 11:14   #7
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Это абсолютный адрес в физическом адресном пространстве.
Чтобы каким-то образом получить к нему доступ из защищенного режима, нужно воспользоваться соответствующими средствами ОС, если она такое позволяет. Т.е. отмапить физический адрес на логический.
В DPMI я это делал, а вот как это сделать в WinAPI - как-то не знаю, не возникало такой потребности.
Подозреваю, что эти данные можно раздобыть из реестра.

Да, есть в реестре
\HKEY_LOCAL_MACHINE\HARDWARE\DESCRI PTION\System\SystemBiosDate
и
SystemBiosVersion

Последний раз редактировалось s-andriano; 05.05.2012 в 11:19.
s-andriano вне форума Ответить с цитированием
Старый 05.05.2012, 11:27   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Подозреваю, что эти данные можно раздобыть из реестра.
Или поискать в WMI... Думаю там тоже будет возможность получить все о БИОСе что можно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.05.2012, 11:39   #9
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

WMI - из пушки по воробьям. Намного как тяжелее, так и дольше, чем работа с реестром.
s-andriano вне форума Ответить с цитированием
Старый 05.05.2012, 11:59   #10
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

$F000:0 так это ж, кажется, и есть логический адрес (F000 - адрес, : - разделитель, 0 - смещение). Физический адрес - это $F0000.
Если я прав, то каким образом сослаться на этот адрес?
Так?
Код:
p:=F00000;
Или же все сложнее?
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать версию сервера? Vit@L БД в Delphi 2 04.11.2011 16:54
как узнать дату создания файла green-shrek Помощь студентам 5 25.02.2010 17:33
Как получить дату BIOS (Windows 7) RIO Общие вопросы Delphi 1 05.02.2010 23:42
Как узнать версию библиотеки в Devcpp? Lavisa Общие вопросы C/C++ 2 30.07.2009 16:44
Как узнать версию браузера FlooPy PHP 3 24.11.2007 23:25