【微机实验系列】PCI设备操作

  前两天写的博客居然有访问,我特别诧异那里面到底有没有不是我的访问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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值