Простой вопрос по asm в С
От: Stas Украина  
Дата: 19.02.02 12:38
Оценка:
Добрый день.
Задача: прочитать серийный номер 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
Re: Простой вопрос по asm в С
От: Sergey Россия  
Дата: 19.02.02 13:00
Оценка:
Здравствуйте 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: Простой вопрос по asm в С
От: Stas Украина  
Дата: 19.02.02 13:10
Оценка:
Здравствуйте 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 баллов!!!


а как правильно-то?
Re[3]: Простой вопрос по asm в С
От: Sergey Россия  
Дата: 19.02.02 13:25
Оценка:
Здравствуйте 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[4]: Простой вопрос по asm в С
От: Stas Украина  
Дата: 19.02.02 14:13
Оценка:
S>>а как правильно-то?
S> Понятия не имею

Anyway, спасибо за советы.

S> Никогда таких задач не возникало. Но из драйвера, вроде, должно получиться. Еще посмотри в сторону ACPI и WMI, может там что-нибудь на эту тему есть.

S> BTW, а зачем тебе серийный номер биоса? Для защиты, IMHO, не подойдет — его поменять за пять минут можно.
WMI — нельзя использовать — "таковы условия регаты" — (с) м/ф про Капитана Врунгеля

А BIOS SN хочет видеть заказчик среди прочих сведений о своей тачке.
Re[4]: Простой вопрос по asm в С
От: Patalog Россия  
Дата: 20.02.02 06:35
Оценка:
Здравствуйте Sergey, Вы писали:

[skip]
S> Понятия не имею Никогда таких задач не возникало. Но из драйвера, вроде, должно получиться. Еще посмотри в сторону ACPI и WMI, может там что-нибудь на эту тему есть.
Сорри, что влез, но знакомое слово увидел и не удержался
Есть рабочий пример на WMI? Я сколько не пробовал — не работает В смысле работет, но все возвращаемые значения == VT_NULL
Почетный кавалер ордена Совка.
Re[5]: Простой вопрос по asm в С
От: Владимир Гренадеров Россия  
Дата: 20.02.02 12:32
Оценка:
Здравствуйте Stas, Вы писали:

S>WMI — нельзя использовать — "таковы условия регаты" — (с) м/ф про Капитана Врунгеля


S>А BIOS SN хочет видеть заказчик среди прочих сведений о своей тачке.

S>

А какая винда? Если NT, то могу кинуть прогу, которая может читать участки физической
памяти по нужному адресу (адрес COM-порта, состояние клавы, etc). Номер BIOS'a вроде там же.
OK
Re[6]: Простой вопрос по asm в С
От: Stas Украина  
Дата: 20.02.02 14:05
Оценка:
Здравствуйте Владимир Гренадеров, Вы писали:

ВГ>Здравствуйте Stas, Вы писали:


S>>WMI — нельзя использовать — "таковы условия регаты" — (с) м/ф про Капитана Врунгеля


S>>А BIOS SN хочет видеть заказчик среди прочих сведений о своей тачке.

S>>

ВГ> А какая винда? Если NT, то могу кинуть прогу, которая может читать участки физической

ВГ>памяти по нужному адресу (адрес COM-порта, состояние клавы, etc). Номер BIOS'a вроде там же.

Винда 2000. Буду признателен за прогу.
Re[7]: Простой вопрос по asm в С
От: Владимир Гренадеров Россия  
Дата: 20.02.02 14:16
Оценка: 3 (1)
Здравствуйте Stas, Вы писали:

S>Винда 2000. Буду признателен за прогу.


Э-э... А куда кидать-то?
OK
Re[8]: Простой вопрос по asm в С
От: Stas Украина  
Дата: 20.02.02 14:31
Оценка:
Здравствуйте Владимир Гренадеров, Вы писали:

ВГ>Здравствуйте Stas, Вы писали:


S>>Винда 2000. Буду признателен за прогу.


ВГ>Э-э... А куда кидать-то?


stas@astral.kiev.ua

Сорри, но почему-то не получается заапдейтить свои детаилс.
Или РСДН или моя Mozilla глючит
Re[7]: Простой вопрос по asm в С
От: cv Украина  
Дата: 20.02.02 16:55
Оценка:
> А винда? какая Если NT, то могу кинуть прогу, которая может читать участки физической
>памяти по нужному адресу (адрес COM-порта, состояние клавы, etc). Номер BIOS'a вроде там же.

А можно и мне кинуть ( прогу ес-но ).
А еще лучше ссылку на нее.
---
Заранее благодарен.
---
LMD
Re: Простой вопрос по asm в С
От: vkim  
Дата: 21.02.02 03:25
Оценка:
Здравствуйте 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-строки. Поэтому надо далать так:
#include <stdio.h>

void main()
{
    char *pDate = (char *)0xFFFF5;
    printf("Bios date:\n%s", pDate);
    return;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.