前两天写的博客居然有访问,我特别诧异那里面到底有没有不是我的访问2333感觉写的博客跟写树洞差不多了,如果有看到这里的人求一个留言or其他的,让我知道一下我写的东西其实是真的发在网上了而不是扔进树洞里了谢谢~
这一篇是关于PCI操作的,说真的我也蛮诧异在这个顶着一堆ddl的时候我居然还在以写树洞的方式写着技术博客和课程总结2333哎刚查了下前面的博文,发现如果我还没有上这门课的话,基本是找不过来的。于是我决定强行加一些关键字,给自己加加戏~PKU 微机实验 实验报告 PCI设备操作 配置空间读取 列举全部PCI设备 显示出场商ID和设备ID
啊上面就是一些乱七八糟求命中的关键字啦,或者是老学姐的祝福hhhh我的理解里,PCI是一种总线上的传输方式,PCI设备就是和主设备用PCI协议交流的设备。那么他们怎么交流呢?用PCI BIOS的系统调用,可以看到这个系统都有哪些PCI设备。
至于实验内容,3.3.1的配置空间读取是已经有了样例程序的了,3.3.2列举全部PCI设备就是把所有的可能组合都试一下看看哪些是真的有PCI设备的,哪些是空的。这里有一个点,仅在功能号为0时,进行多功能判断。所以在循环时,这里就涉及到跳过一些东西的问题了。开始的我,天真的用了总线号、设备号、功能号进行了三重循环,最终把自己带进了大坑里。后面在善良老师的提醒下,你可以用一个BX寄存器++来解决问题啊!哎对啊好机智啊,那我就不用加BH加BL写双重循环,还要算跳过哪些东西,还把内外层循环的循环变量换了一下成功把自己写死机了2333最后挣扎着推倒重来写了一个单重循环的。话说其实我特别诧异三个半小时的实验时间,我是怎么做到每次都差点/真的做不完的。或者为什么我总能踩到那么多的坑,总能弄出奇奇怪怪的错来。对比一下旁边桌速战速决出去浪的同学,真是感觉自己宛如智障啊
最后直接贴代码吧~
3.3.2 列举全部PCI 设备
在DOS 下编程序列举出系统中的全部PCI 设备,显示出厂商ID 和设备ID。
提示:
1. 穷举总线号、设备号、功能号,通过三重循环读取每个组合的厂商和设备ID,显示出所有不是FFFFH
的项目。
2. 总线号不必穷举到255,穷举到8 就足够了。
3. 简单采用这种方法获得的列表要比实际的设备多,需要更多的PCI 知识才能获得精确的设备列表。
4. PCI 配置空间的第0E 字节为“首部类型”,其最高位标识设备是否为多功能设备。当其设置为0 时,
设备为单功能设备,不必穷举8 个功能号来查询其是否为多功能设备。不过要注意,只能在功能号
为0 的时候检查首部类型,对于功能号不是0 的设备,读取首部类型来判断其是否多功能是没有意
义的。
STACK SEGMENT PARA STACK
DW 128H DUP(0)
STACK ENDS
DATA SEGMENT
DEVICEID DW 0
VENDORID DW 0
HEADER DW 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV BH,0H
LOOPBH: MOV BL,00H
LOOPBL: MOV AH,0B1H
MOV AL,09H
MOV DI,0H
INT 1AH
MOV VENDORID,CX
MOV AH,0B1H
MOV AL,09H
MOV DI,02H
INT 1AH
MOV DEVICEID,CX
MOV AX,0B109H ;GET HEADER
MOV DI,0EH
INT 1AH
AND CX,080H ; GET THE HIGHEST BIT
MOV HEADER,CX
CMP AH,0H ; AH=0 SUCCESS
JNZ JBL
MOV AX,DEVICEID
CMP AX,0FFFFH
JZ JBL
MOV AX,VENDORID
CMP AX,0FFFFH
JZ JBL
JMP PRINT
LOOPBHTEMP: JMP LOOPBH
PRINT: MOV AX,VENDORID
CALL DISP
MOV DL,' '
MOV AH,2
INT 21H
MOV AX,DEVICEID
CALL DISP
MOV DL,' '
MOV AH,2
INT 21H
; MOV DL,0DH
; MOV AH,2
; INT 21H
; MOV DL,0AH
; MOV AH,2
; INT 21H
JBL: MOV DL,BL
AND DL,07H
CMP DL,0H
JNZ JBL2
MOV CX,HEADER
TEST CX,080H
JNZ JBL2
;AND BL,0F80
ADD BL,07H
JBL2: INC BL
CMP BL,0FFH
JNZ LOOPBL
JBH: INC BH
CMP BH,08H
JNZ LOOPBHTEMP
MOV AH,4CH
INT 21H
DISP PROC NEAR
PUSH BX
PUSH CX
MOV BX,AX
MOV CX,4H
LLOOP1: MOV AX,BX
CALL DISP2
PUSH CX
MOV CL,4
SHL BX,CL
POP CX
LOOP LLOOP1
POP CX
POP BX
RET
DISP ENDP
DISP2 PROC NEAR
PUSH DX
PUSH CX
AND AH,0F0H
MOV CL,4
SHR AH,CL
MOV DL,AH
CMP DL,9
JLE NUM
ADD DL,7
NUM: ADD DL,30H
MOV AH,02H
INT 21H
POP CX
POP DX
RET
DISP2 ENDP
CODE ENDS
END START