配置机构的地址端口的寄存器是0CF8H-0CFBH;数据端口寄存器是0CFCH-0CFFH。
①将所要访问的总线号、设备号、功能号和双字地址写到配置地址端口寄存器中;
②执行一次对配置数据端口寄存器的读操作或写操作。
读PCI总线的1号扩展槽(设备号)2号功能设备的厂商标志(寄存器号)。(写出汇编语言代码段)
题目分析:读操作相对于写操作更加简单。首先确定需要进行传输给配置地址端口寄存器的内容。使能位为1,保留位中各位均为0,总线号默认为0,设备号为1,功能号为2,寄存器号为0(因为在第一行),因此可以得到需要写入到地址端口寄存器中的内容为:10000000000000000000101000000000(转换为十六进制即为80000A00H)
;首先将控制端口的地址放入地址寄存器DX中
MOV DX,0CF8H
;接着将双字地址放入双字累加寄存器EAX中
MOV EAX,80000A00H
;将需要写入地址端口的内容通过OUT指令输出到地址端口中
OUT DX,EAX
;首先将数据端口的地址放入地址寄存器DX中
MOV DX,0CFCH
;使用IN指令从指定的端口地址DX处读取数据并送入EAX寄存器中
IN EAX,DX
给总线号为7的PCI总线的4号扩展槽(设备号)0号功能设备的基址寄存器0分配8个I/O地址空间(写出汇编语言代码段)。
题目分析:和上一题的思路类似。首先通过向地址端口赋值用于指定总线号、设备号、功能号和寄存器号;接着向数据端口输出基址寄存器中应该存放的数据即可。
①确定地址端口的写入内容:根据基础知识中配置地址信息的格式可知,此处写入地址端口寄存器的数据的二进制形式应该为(其中寄存器号通过基础知识中配置空间的内容获得)
1 0000000 00000111 00100 000 010000 00 B
转换为十六进制即为80072040H。
②确定数据端口的写入内容:根据基础知识中基址寄存器中的内容分析可知,基地址中末位b0=1,表示是I/O空间指针。同时b1位保留位置零。由于分配大小为8个字节,因此第一位为1的位是b3。由此可以确定基地址寄存器中的内容为:
FFFF FFF9(最后一个字节是1001)
③编写完整汇编代码
;首先将地址端口寄存器的地址存入寄存器DX中
MOV DX,0CF8H
;接下来将要向地址端口写入的数据放入寄存器中
MOV EAX,80072040H
;把地址数据写入到地址端口中
OUT DX,EAX
;把数据端口寄存器的地址存入寄存器DX中
MOV DX,OCFCH
;把要向数据端口写入的数据放入寄存器中
MOV EXA,FFFFFF9H
;向数据端口输出数据
OUT DX,EAX
给总线号为5的PCI总线的3号扩展槽4号功能设备的基址寄存器4分配256个存储器地址空间。
题目分析:
①确定地址端口寄存器写入的内容:
1 0000000 00000101 00011 100 100000 00
转化为十六进制即为
80051C80H
②确定数据寄存器端口写入的内容:
1111 1111 1111 1111 1111 1111 0000 0000
转化为十六进制数即为
FFFFFF00H
③编写完整汇编代码
MOV DX,0CF8H
MOV EAX,80051C80H
OUT DX,EAX
MOV DX,0CFCH
MOV EXA,FFFFFF00H
OUT DX,EAX