Добрый день.
Задача: прочитать серийный номер BIOSа.
Нашёл на этом форуме подсказку: надо прочитать участок памяти по адресу FFFF5, и кусок кода на паскале:
[цитата]
var bd:dword;
begin
asm
mov eax,$FFFF5
mov bd, dword ptr [eax]
end;
end;
[/цитата]
Перевёл его на С т.о.:
int main(int argc, char* argv[])
{
unsigned long bd;
__asm{
mov eax, 0x000FFFF5;
mov bd, dword ptr [eax]; // <<---- ошибка здесь (по словам компилятора)
}
printf("\nReaded: %d",bd);
return 0;
}
а он не компилится
ошибка:
D:\VCPorjects\TestBios\TestBios.cpp(14) : error C2415: improper operand type
На asm'е я писал давно и мало, объясните, пожалуйста, что я делаю неправильно.
С уважением, Stas.
Re: Простой вопрос по asm в С
От:
Аноним
Дата:
19.02.02 12:56
Оценка:
Здравствуйте Stas, Вы писали:
S>Добрый день. S>Задача: прочитать серийный номер BIOSа. S>Нашёл на этом форуме подсказку: надо прочитать участок памяти по адресу FFFF5, и кусок кода на паскале:
... S>а он не компилится :( S>ошибка:
S>На asm'е я писал давно и мало, объясните, пожалуйста, что я делаю неправильно. S>С уважением, Stas.
Даже если и скомпилиться — все равно ничего не получиться :(
( Все горездо сложнее — там другая модель памяти, режим проца и т. д. )
Если надо подробнее — ICQ=132776788
Здравствуйте Stas, Вы писали:
S>Добрый день. S>Задача: прочитать серийный номер BIOSа. S>Нашёл на этом форуме подсказку: надо прочитать участок памяти по адресу FFFF5, и кусок кода на паскале:
S>[цитата]
S>var bd:dword; S>begin S>asm S>mov eax,$FFFF5 S>mov bd, dword ptr [eax] S>end; S>end;
S>[/цитата]
S>Перевёл его на С т.о.:
S>
S>int main(int argc, char* argv[])
S>{
S> unsigned long bd;
S> __asm{
S> mov eax, 0x000FFFF5;
S> mov bd, dword ptr [eax]; // <<---- ошибка здесь (по словам компилятора)
S> }
S> printf("\nReaded: %d",bd);
S> return 0;
S>}
S>
S>а он не компилится S>ошибка: S>D:\VCPorjects\TestBios\TestBios.cpp(14) : error C2415: improper operand type
Ну вроде как нет такой команды. Надо сначала в регистр закинуть. Впрочем, могу и соврать.
S>На asm'е я писал давно и мало, объясните, пожалуйста, что я делаю неправильно.
По моему, неправильно тут все. Из Win32 программы ты, по идее, должен таким кодом просто получить Access violation. А DOS программ VC не компилит.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте Sergey, Вы писали:
S>Здравствуйте Stas, Вы писали:
S>>Добрый день. S>>Задача: прочитать серийный номер BIOSа. S>>Нашёл на этом форуме подсказку: надо прочитать участок памяти по адресу FFFF5, и кусок кода на паскале:
S>>[цитата]
S>>var bd:dword; S>>begin S>>asm S>>mov eax,$FFFF5 S>>mov bd, dword ptr [eax] S>>end; S>>end;
S>>[/цитата]
S>>Перевёл его на С т.о.:
S>>
S>>int main(int argc, char* argv[])
S>>{
S>> unsigned long bd;
S>> __asm{
S>> mov eax, 0x000FFFF5;
S>> mov bd, dword ptr [eax]; // <<---- ошибка здесь (по словам компилятора)
S>> }
S>> printf("\nReaded: %d",bd);
S>> return 0;
S>>}
S>>
S>>а он не компилится S>>ошибка: S>>D:\VCPorjects\TestBios\TestBios.cpp(14) : error C2415: improper operand type S> Ну вроде как нет такой команды. Надо сначала в регистр закинуть. Впрочем, могу и соврать.
S>>На asm'е я писал давно и мало, объясните, пожалуйста, что я делаю неправильно. S> По моему, неправильно тут все. ...
5 баллов!!!
Здравствуйте Stas, Вы писали:
S>Здравствуйте Sergey, Вы писали:
S>>Здравствуйте Stas, Вы писали:
S>>>Добрый день. S>>>Задача: прочитать серийный номер BIOSа. S>>>Нашёл на этом форуме подсказку: надо прочитать участок памяти по адресу FFFF5, и кусок кода на паскале:
S>>>[цитата]
S>>>var bd:dword; S>>>begin S>>>asm S>>>mov eax,$FFFF5 S>>>mov bd, dword ptr [eax] S>>>end; S>>>end;
S>>>[/цитата]
S>>>Перевёл его на С т.о.:
S>>>
S>>>int main(int argc, char* argv[])
S>>>{
S>>> unsigned long bd;
S>>> __asm{
S>>> mov eax, 0x000FFFF5;
S>>> mov bd, dword ptr [eax]; // <<---- ошибка здесь (по словам компилятора)
S>>> }
S>>> printf("\nReaded: %d",bd);
S>>> return 0;
S>>>}
S>>>
S>>>а он не компилится S>>>ошибка: S>>>D:\VCPorjects\TestBios\TestBios.cpp(14) : error C2415: improper operand type S>> Ну вроде как нет такой команды. Надо сначала в регистр закинуть. Впрочем, могу и соврать.
S>>>На asm'е я писал давно и мало, объясните, пожалуйста, что я делаю неправильно. S>> По моему, неправильно тут все. ... S>5 баллов!!!
S> S>а как правильно-то?
Понятия не имею Никогда таких задач не возникало. Но из драйвера, вроде, должно получиться. Еще посмотри в сторону ACPI и WMI, может там что-нибудь на эту тему есть.
BTW, а зачем тебе серийный номер биоса? Для защиты, IMHO, не подойдет — его поменять за пять минут можно.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Anyway, спасибо за советы.
S> Никогда таких задач не возникало. Но из драйвера, вроде, должно получиться. Еще посмотри в сторону ACPI и WMI, может там что-нибудь на эту тему есть. S> BTW, а зачем тебе серийный номер биоса? Для защиты, IMHO, не подойдет — его поменять за пять минут можно.
WMI — нельзя использовать — "таковы условия регаты" — (с) м/ф про Капитана Врунгеля
А BIOS SN хочет видеть заказчик среди прочих сведений о своей тачке.
[skip] S> Понятия не имею Никогда таких задач не возникало. Но из драйвера, вроде, должно получиться. Еще посмотри в сторону ACPI и WMI, может там что-нибудь на эту тему есть.
Сорри, что влез, но знакомое слово увидел и не удержался
Есть рабочий пример на WMI? Я сколько не пробовал — не работает В смысле работет, но все возвращаемые значения == VT_NULL
Здравствуйте Stas, Вы писали:
S>WMI — нельзя использовать — "таковы условия регаты" — (с) м/ф про Капитана Врунгеля
S>А BIOS SN хочет видеть заказчик среди прочих сведений о своей тачке. S>
А какая винда? Если NT, то могу кинуть прогу, которая может читать участки физической
памяти по нужному адресу (адрес COM-порта, состояние клавы, etc). Номер BIOS'a вроде там же.
Здравствуйте Владимир Гренадеров, Вы писали:
ВГ>Здравствуйте Stas, Вы писали:
S>>WMI — нельзя использовать — "таковы условия регаты" — (с) м/ф про Капитана Врунгеля
S>>А BIOS SN хочет видеть заказчик среди прочих сведений о своей тачке. S>>
ВГ> А какая винда? Если NT, то могу кинуть прогу, которая может читать участки физической ВГ>памяти по нужному адресу (адрес COM-порта, состояние клавы, etc). Номер BIOS'a вроде там же.
> А винда? какая Если NT, то могу кинуть прогу, которая может читать участки физической >памяти по нужному адресу (адрес COM-порта, состояние клавы, etc). Номер BIOS'a вроде там же.
А можно и мне кинуть ( прогу ес-но ).
А еще лучше ссылку на нее.
---
Заранее благодарен.
Здравствуйте Stas, Вы писали:
S>Добрый день. S>Задача: прочитать серийный номер BIOSа. S>Нашёл на этом форуме подсказку: надо прочитать участок памяти по адресу FFFF5, и кусок кода на паскале:
S>[цитата]
S>var bd:dword; S>begin S>asm S>mov eax,$FFFF5 S>mov bd, dword ptr [eax] S>end; S>end;
S>[/цитата]
S>Перевёл его на С т.о.:
S>
S>int main(int argc, char* argv[])
S>{
S> unsigned long bd;
S> __asm{
S> mov eax, 0x000FFFF5;
S> mov bd, dword ptr [eax]; // <<---- ошибка здесь (по словам компилятора)
S> }
S> printf("\nReaded: %d",bd);
S> return 0;
S>}
S>
S>а он не компилится S>ошибка: S>D:\VCPorjects\TestBios\TestBios.cpp(14) : error C2415: improper operand type
S>На asm'е я писал давно и мало, объясните, пожалуйста, что я делаю неправильно. S>С уважением, Stas.
1. По адресу 0xFFFF5 находится не серийный номер биоса, а дата выпуска.
2. Ошибка в твоем коде возникает потому, что ты пытаешься прочитать данные из памяти с помощью косвенной адресации в переменную, то есть тоже в память. Надо делать по крайней мере так: mov eax, dword ptr [eax]. Но и это в ДАННОМ случае неправильно, потому что дата биоса хранится в виде ASCIIZ-строки. Поэтому надо далать так: