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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2012, 14:53   #11
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Rin, нет, так нельзя!
это Вы путаете - логический адрес вашего указателя и ФИЗИЧЕСКИЙ адрес.
пост #7 перечитайте...


p.s. я почему по танцы с бубном сразу сказал - Windows'ские программы ограничены в своих возможностях - их просто так не пускают не к физическим портам ввода/вывода, ни к физической памяти. (и, кстати, правильно делают). Получить туда доступ можно, имхо, но либо написав свой драйвер, либо воспользовавшись компонентами (которые это как-то делают, либо через свой драйвер, либо через внедрение в ring0 - не знаю!)
А ещё лучше - отказаться от этой идеи (лезть за версией биоса в сам биос) и воспользоваться информацией из реестра!

Последний раз редактировалось Serge_Bliznykov; 05.05.2012 в 14:57.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.05.2012, 17:36   #12
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Я ж почему спросил про absolute $F000:0 . Помню, мне очень давно попался исходник с этим absolute. И вот я долго думал, что ж мне сделать, чтобы эта дребедень заработала. Так и не придумал, и забыл про неё. А вот опять увидел этот скверную ссылку на адрес. Как ссылаться на адрес, не используя ЭНТОТ absolute?
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 05.05.2012, 21:08   #13
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Rin Посмотреть сообщение
$F000:0 так это ж, кажется, и есть логический адрес (F000 - адрес, : - разделитель, 0 - смещение). Физический адрес - это $F0000.
Если я прав, то каким образом сослаться на этот адрес?...
И тот и другой - это один и тот же физический адрес, только записанный в сегментированном и линейном виде.
В многозадачных ОС доступ к физическим адресам затруднен. Поэтому я и предложил воспользоваться реестром.
Еще один вариант - запустить дочерний процесс в RM или DPMI и результат его работы использовать у себя в программе.

Вдогонку:
absolute $F000:0
это исключительно в RM.
вообще же "absolute" служит для того, чтобы у одной и той же переменной создать несколько псевдонимов (возможно, разного типа). К абсолютным (физическим) адресам она никакого отношения не имеет.

Последний раз редактировалось s-andriano; 05.05.2012 в 21:12.
s-andriano вне форума Ответить с цитированием
Старый 05.05.2012, 23:15   #14
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Вот интересно, а что по идее должно было записаться в buf, если buf : array[0..2] of byte absolute $F000:0; ? Почему именно array[0..2] of byte ?
А что более интересно, так это то, что мы выходим за размеры массива, выполняя цикл
Код:
  for I:=0 to 255 do buf[I] := Read(I);
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 05.05.2012, 23:27   #15
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Честно говоря, никогда не интересовался кодами команд 8086, но подозреваю, что первые 3 байта - это команда перехода на начало кода.
А то, что выходим за пределы массива, (разумеется, при выключенной опции проверки) так это не страшно: массив (в отличие от обычного описанного массива) имеет фиксированный адрес в памяти и не заканчивается, в отличие от массива описанного в переменных. Так что цикл мы могли смело продолжать до 65535.
Непонятно только, как мы собираемся записывать в микросхему ПЗУ. (физически там, правда, ОЗУ, но оно все равно защищено от записи)

В приведенном в посте №4 исходнике я не разбирался, но что-то мне кажется, что там читается CMOS, а не BIOS.

Посмотрел код внимательнее.
Вероятно, программа изначально читала как CMOS, так и BIOS, причем CMOS неправильно. Поэтому чтение CMOS из нее выкинули, но не все - остались ненужные процедуры на ассемблере и ненужный цикл, который ни на что не влияет. А в файле оказывается образ BIOS, правда, без последнего байта. Но это не сложно подправить.

Думаю, в БорландПаскале должно работать следующее (у меня проверить не на чем)
Код:
const
    DefName = 'bios.$$$';
var f: file;
    i: integer;
    buf : array[0..65535] of byte absolute $F000:0;
    Name : string[80];

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

begin
  WriteLn('Чтение BIOS');
  if ParamCount < 1 then Name := DefName
  else Name := ParamStr(1);
  assign(f,Name);
{$I-}
  rewrite(f,1);
  if IOResult <> 0 then Err('Невозможно создать файл '+Name);
  BlockWrite(f,buf,$ffff);
  if IOResult <> 0 then Err('Ошибка при записи файла '+Name);
  BlockWrite(f,buf[$ffff],1);
  if IOResult <> 0 then Err('Ошибка при записи файла '+Name);
  close(f);
  WriteLn('Done.');
end.

Последний раз редактировалось s-andriano; 05.05.2012 в 23:51.
s-andriano вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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