PCI BIOS в 32--разрядном режиме

Тема в разделе "WASM.BEGINNERS", создана пользователем arrhangel, 1 дек 2010.

  1. arrhangel

    arrhangel New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2010
    Сообщения:
    19
    В книге "Программирование аппаратных средств Windows" - В.Несвижский есть такой пример:

    mov ax,0b101h
    int 1ah
    cmp ah, 00h
    jne no_pcibios
    cmp edx, 20494350h
    jne no_pci
    mov byte ptr num_bus,cl


    но он зависает при вызове int 1ah, как я понял он только для 16-битовых программ, для 32 надо находить точку входа.
    Если можно один примерчик.
    Спасибо заранее за ваш труд.
     
  2. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    arrhangel
    Тебе нужно это в ring 0 выполнить?
     
  3. arrhangel

    arrhangel New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2010
    Сообщения:
    19
    я хотел запустить программу с провами админестратора из под windows для проверки, если pci bios или нет. я так понемаю что это ring 3.
     
  4. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Если у тебя вопрос - "Как это отработать на asm-е,
    если я не знаю asm, но знаком с С?"
    То так ...
    Код (Text):
    1. // pcbios.cpp : Defines the entry point for the console application.
    2. //
    3.  
    4. #include "stdafx.h"
    5. #include <stdio.h>
    6.  
    7. int main(int argc, char* argv[])
    8. {
    9.   unsigned char flag=0;         // Объявление переменных
    10.  
    11.  
    12.   _asm mov ax,0b101h// Проверка присутствия PCI BIOS в системе
    13.   _asm int 1ah      // Вызываем прерывание 1ah
    14.   _asm mov flag,ah  // Флаг присутствия
    15.  
    16.   if (flag!=0)  // Если он не равен нулю, то шина отсутствует
    17.    {
    18.      printf("Шина PCI отсутствует в системе\n");
    19.      return 1;  // Выход
    20.    }
    21. return 0;       // Выход
    22. }
    Если ты хочешь это запустить (под Win XP к примеру как у меня)
    то выйдет ...

    [​IMG]

    Из под ring 0 - нужно получать доступ к функциям BIOS!
    Как сказал бы тут кто-то не помню - "надо дровину писать!" :))
    Или ставь DOS или Win 3.1 или Win95 да тренируйся.
     
  5. arrhangel

    arrhangel New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2010
    Сообщения:
    19
    спасибо за пример на с++ , но я хотел на ассемблере. может какие нибудь функции win api вызывать надо?
    ну не может быть что-бы на ассемблере так все сложно было, может кто подскажет?!
     
  6. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.561
    Адрес:
    Russia
    _sheva740
    Бред. Напишите дров и вызовите функцию биос. А я посмотрю на вас.
    arrhangel
    Из под виндоус вы не получите доступ к pci bios.
    Но функции биос доступны в NTVDM. Пишите дос программу.
    Разве что для загрузки драйвера.
    Даже если вы напишете драйвер для PCI шины, и запустите его, то в нем нельзя вызывать прерывания биос, можно только работать с шиной и устройствами на шине напрямую.
    В общем RTFM
     
  7. arrhangel

    arrhangel New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2010
    Сообщения:
    19
    спасибо за ответы.
     
  8. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Судя по всему int 1ah не доступен даже в NTVDM для XP. ((
    http://support.microsoft.com/kb/314106

    И вот еще вроде как проверка ...

    [​IMG]

    А после выполнения int 1ah
    Код (Text):
    1. mov ah, 02h ; 02 - ф-ция прерывания 1Ah для получения текущего времени
    2. int 1Ah ; Вызываем прерывание
    3.   ; В регистре CH будут часы
    4.   ; В регистре CL будут минуты
    5.   ; В регистре DH будут секунды
    ... а CX и DX по нулям ((
     
  9. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    _sheva740,

    Неплохо бы дать int1A/02 отработать до конца прежде, чем проверять cx:dh. И двоечку, желательно, в ah. Иначе казус выйдет.
     
  10. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    baldr
    Батенька - Да Вы кудесник! :)
    Виноват, был неправ. Все понял в 10 часов 40 минут 11 секунд :)

    [​IMG]

    arrhangel
    Дак вот же оно - счатье-то, - рядом :)
     
  11. arrhangel

    arrhangel New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2010
    Сообщения:
    19
    спосибо большое,

    тоесть только на досовском варианте работает, в 32-х битном варианте не сушествует.