BIOS, системные прерывания. int 11h, int 12h в С++ / C

603
31 января 2017, 22:08

Стоит задача получить информацию о компьютере, используя системное прерывание int 11h, которое записывает в регистр AX слово состояния (конфигурации). Доступ к прерываниям можно получить из заголовка dos.h, однако функция, обеспечивающая работу с прерыванием int86() была найдена только в библиотеках и хедерах компилятора за 1993 год, MS Visual 1.52 (1993 г) 16-битный, что мне не подходит, в виду наличия 64-битной ОС. Был написан следующий код:

/*#include <stdio.h>
int main()
{
  short a=0;
  __asm
  {       
    int 11h
    mov a, ax
  }
  printf("%d",a);    
  return 0;
}

который выводит на экран слово состояния в числовом виде, равном -14302. И вроде все устраивает, но есть несколько но, которые не получилось решить:

  1. Компилируется этот код тоже только выше указанным компилятором (работаю VirtualBox с Win7 (32 bit)). Точнее, скомпилировать получилось еще в MS Visual C++ 2010 Express, а вот при запуске программы она вылетает и проблема в строчке int 11h
  2. Это магическое число -14302 является результатом также и на планшете (Windows 8.1, 32 bit). И на другом компьютере (WinXP, 32 bit).

Второе "но" наталкивает на мысли, что что-то работает неверно. Разве может быть одинаковым слово состояния на 3 абсолютно разных вычислительных устройствах (планшет, ноутбук, компьютер)?
Прошу советов по решению данной задачи.

Answer 1

Команда прерывание процессора int X это указание процесору вызвать функцию адрес которой хранится в таблице IDT (Interrupt Descriptor Table) (таблица векторов прерываничя) и вектором X. При загрузке, BIOS первоночально записывает адреса своих функций, но после загрузки ядра ОС. ОС записывает свои адреса в таблицу IDT. Поэтому в определеных ОС Вы будете получать одинаковый ответ.

Для того чтобы сделать asm вставку в gcc. В gcc используется AT&T синтаксис ассемблера

#include <stdio.h>
int main()
{
  int a;
  __asm__(
      "int $0x11\n\t"
     :"=a"(a)
     );
  printf("%d",a);    
  return 0;
 }

Но можно использовать и Intel синтаксис

#include <stdio.h>
int main()
{
  int a;
  __asm__(
         ".intel_syntax noprefix\n\t"
         "int 11h\n\t"
        :"=a"(a)
        );
  printf("%d",a);    
  return 0;
 }
READ ALSO
Ошибка в программе на C++

Ошибка в программе на C++

Помогите найти ошибку в коде, в ходе выполнения программы счётчик n=0, хотя у меня в блокноте есть такая запись "Ivanov Vasya 900-90-90"Суть программы:...

416
Является ли функция функтором

Является ли функция функтором

Является ли функция функтором?

426
Зачем нужен 4 конструктор, когда есть 3? [требует правки]

Зачем нужен 4 конструктор, когда есть 3? [требует правки]

Зачем нужен 4 конструктор, когда есть 3?

425
Приложение для обмена сообщениями C++ [требует правки]

Приложение для обмена сообщениями C++ [требует правки]

ЗдравствуйтеНеобходимо написать приложение для обмена сообщениями между пользователями (т

396