Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Windows/Dos > обращение к PCI


Автор: qwerty1122 23.4.2014, 14:57
привет!вот по книжке одной написал программку для обращения к PCI:
Код

.MODEL MEDIUM
.486P
.stack 100h
.code

SEGMENT sseg para stack 'STACK'
DB 400h DUP(?)
ENDS
IDEAL
DATASEG
VendorID      DW ? ;идентификатор изготовителя
DeviceID      DW ? ;идентификатор устройства
ClassCode     DD ? ;тип устройства
InterruptLine DB ? ;номер используемого прерывания IRQ
BusNumber     DB ? ;номер шины
DeviceNumber  DB ? ;номер устройства и номер функции
NoPCI  DB 12,18,"Система не поддерживает PCI USB",0
NoUSB DB 12,23,"Контроллер не найден",0
BadReg DB 12,28,"Неверный номер регистра",0
ENDS

CODESEG
PROC PCITest
; Опрос PCI-устройств
; наличие PCI BIOS
        mov     AX,0B101h
        int     1Ah
        jc      @@PCIBIOSNotFound
        cmp     EDX,20494350h
        jne     @@PCIBIOSNotFound
; USB контроллер
        mov     AX,0B103h
        mov     ECX,0C0310h
        mov     SI,0
        int     1Ah
        jc      @@DeviceNotFound
        mov     [BusNumber],BH
        mov     [DeviceNumber],BL
; идентификатор изготовителя
        mov     AX,0B109h ;читать слово
        mov     DI,0      ;смещение слова
        int     1Ah
        jc      @@BadRegisterNumber
        mov     [VendorID],CX
; идентификатор устройства
        mov     AX,0B109h ;читать слово
        mov     DI,2      ;смещение слова
        int     1Ah
        jc      @@BadRegisterNumber
        mov     [DeviceID],CX
; тип устройства
        mov     AX,0B10Ah ;читать двойное слово
        mov     DI,8      ;смещение слова
        int     1Ah
        jc      @@BadRegisterNumber
        shr     ECX,8
        mov     [ClassCode],ECX
; прерываниe IRQ
        mov     AX,0B108h ;читать байт
        mov     DI,3Ch    ;смещение байта
        int     1Ah
        jc      @@BadRegisterNumber
        mov     [InterruptLine],CL

@@BadRegisterNumber:
@@DeviceNotFound:
@@PCIBIOSNotFound:

ENDP PCITest
ENDS

END

прогоняю ее через tasm и tlink и все хорошо в итоге создается exe-шник,запускаю его и вылазиет ошибка(на прикрепленой картинке)...подскажите как исправить это недоразумение?

Автор: tzirechnoy 23.4.2014, 18:39
Для начала, разумеется, начать обрабатывать ошыбки. Тогда будет заметно понятнее, в каком месте произошли неприятности.

Автор: qwerty1122 23.4.2014, 19:31
Цитата(tzirechnoy @ 23.4.2014,  16:39)
Для начала, разумеется, начать обрабатывать ошыбки. Тогда будет заметно понятнее, в каком месте произошли неприятности.

как я буду обрабатывать ошибки если прогоняя через tasm и tlink все хорошо
от части послушал ваш совет,и не обращая внимания на книгу осторожно по шагам начал заново...вот что получилось
Код

IDEAL
LOCALS
model medium
;---------------------------------------------
dataseg
VendorTXT DB 'VendorID_',0dh,0ah,'$'
VendorID DW ?
DeviceTXT DB 'DeviceID_',0dh,0ah,'$'
DeviceID DW ?
BusTXT DB 'BusNumber_',0dh,0ah,'$'
BusNumber DB ?
NoPCI DB 'NO PCI BIOS',0dh,0ah,'$'
ends
;----------------------------------------------
segment sseg para stack 'stack'
DB 400h DUP(?)
ends
;----------------------------------------------
P386
codeseg
proc PCITest
mov ax,@data
mov ds,ax
mov ax,3
int 10h
mov ax,0b101h
int 1Ah
cmp ah,00h
jc @@PCIBIOSNotFound
cmp EDX,20494350h
jne @@PCIBIOSNotFound
mov dx,offset VendorTXT
mov ah,9
int 21h
mov dx,offset DeviceTXT
mov ah,9
int 21h
mov dx,offset BusTXT
mov ah,9
int 21h

@@PCIBIOSNotFound:
mov dx,offset NoPCI
mov ah,9
int 21h
mov ah,4ch
int 21h

endp PCITest
ends
end


и в итоге,ошибка исчезла...но вот теперь доходит до JNE и в конец...у меня даж слов нет...подскажите мож гдето что то неправильно делаю с инициализацией PCI

Автор: tzirechnoy 24.4.2014, 02:08
Цитата
как я буду обрабатывать ошибки если прогоняя через tasm и tlink все хорошо


Ошыбки периода исполнения (run-time) никак себя особенно не проявляют в tasm и tlink. Обрабатывать их надо, предусматривая соответствующие ветки программ, код в которых выполняется при ошыбках, и делает что-то разумное (например, сообщает пользователю о месте возникновения ошыбки).

А не, как у вас, улетает в неиницыализированные области при любом неожыданном ответе системных вызовов.

PS А, да, вижу, начали обрабатывать. Замечательно, Вам выдан вполне корректный ответ, что PCI BIOS не найден. Видимо, NTVDM (Вы его ведь под NTVDM запускаете? Ну, запускалка DOS-программ под win32?) не поддержывает функцыи PCI BIOS.
Да и, действительно, что ему там поддержывать? Непосредственного доступа к устройствам из NTVDM никогда не было, по соображэниям безопасности и разделения ресурсов. Корректно эмулировался набор из древних таймеров с контроллером прерываний, клавиатуры, PC спикера, старого но всё-таки 16-битного саунд бластера и VGA-адаптэра с VESA-функцыями. Ни одного устройства, требуещего PCI не эмулировалось, потому и поддержка PCI BIOS ему низачем не нужна.

Автор: qwerty1122 24.4.2014, 14:04
да запускаю в DOS программе под win32...раз такая тема что не смогу получить доступ к PCI т.к. не поддерживается то подскажите пожалуйста каким образом я смогу проверить работоспособность программы?(вчера весь вечер голову ломал мож что в коде не так а оказалось вот в чем дело)

Добавлено через 3 минуты и 34 секунды
а вот если сделать загрузочную флешку на DOS то это сможет помочь?

Автор: LeonidPr 24.4.2014, 14:14
Можете установить дос в какой-нибудь эмулятор типа VMWare и там поиграться.

Автор: tzirechnoy 24.4.2014, 22:59
Цитата
а вот если сделать загрузочную флешку на DOS то это сможет помочь?


Да, вполне вариант. Тут, правда, есть сложности что ужэ появляются материнские платы, которые не поддержываются ни одним DOSом из-за своих глюков, но это всё-таки ещё пока редкость.
Другой вариант -- взять эмулятор более нового писюка, например, qemu или, действительно, vmWare. Там, вполне вероятно, что будут эмулироваться какие-то PCI-устройства, и, в частности, скорее всего будет эмулироваться еhci-контроллер USB на PCI. Особенно если указать, что будет эмулироваться или пробрасываться какое-то USB-устройство.
Такжэ в некоторые виртуальные машыны можно пробросить реальное PCI-устройство (хотя поддержка этого довольно кривая).

Автор: qwerty1122 25.4.2014, 18:15
попробовал через DOS,есть прогресс,срабатывает...но вот теперь загвоздка при выводе значения регистра выводится какието невообразимые символы
вот сам код
Код

IDEAL
LOCALS
model medium
;---------------------------------------------
dataseg
VendorTXT DB 'VendorID_',0dh,0ah,'$'
VendorID DW ?
DeviceTXT DB 'DeviceID_',0dh,0ah,'$'
DeviceID DW ?
BusTXT DB 'BusNumber_',0dh,0ah,'$'
BusNumber DB ?
NoPCI DB 'NO PCI BIOS',0dh,0ah,'$'
ends
;----------------------------------------------
segment sseg para stack 'stack'
DB 400h DUP(?)
ends
;----------------------------------------------
P386
codeseg
proc PCITest
mov ax,@data
mov ds,ax
mov ax,3        ;
int 10h            ;очистка экрана
;**********************************************************
mov ax,0b101h    ;проверка наличия PCI
int 1Ah            ;служебное прерывание
cmp ah,00h        ;сравнение
jc @@PCIBIOSNotFound    ;если перенос установлен
cmp EDX,20494350h        ;строка символов PCI
jne @@PCIBIOSNotFound    ;если не равно то переход
    mov dx,offset VendorTXT    
    mov ah,9
    int 21h
    mov dl,al
    mov ah,2
    int 21h
;**********************************************************
jmp @@END

@@PCIBIOSNotFound:
mov dx,offset NoPCI    
mov ah,9
int 21h                    ;вывод сообщения NoPCI
mov ah,4ch
int 21h

@@END:
mov ah,4ch
int 21h

endp PCITest
ends
end


Автор: tzirechnoy 28.4.2014, 01:14
Выводится символ с ASCII-кодом, соответствующим... В общем, херня выводится, через 2102 печатаются символы, числа печатаются заметно сложнее.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)