汇编程序编写的读取PCI配置空间信息的代码(通过IOCF8/IOCFC):
1 ;------------------------------------------------ 2 ;功能: 读取PCI 配置信息,存入文件zpci_config.txt 3 ;环境: DOS + MASM5 4 ;时间: 2015/08 5 ;说明: 通过端口CF8h / CFCh 来读取 6 ; 7 ;---------------------自定义宏结构------------------- 8 ;功能: 在文件中换行 9 nextrow macro 10 mov buffer ,0dh 11 mov buffer+1,0ah 12 mov dx,offset buffer 13 mov cx,2 14 mov ah,40h 15 int 21h 16 endm 17 ;功能:把ascii 表示的字符写入文件 18 tofile macro ascii 19 mov buffer,ascii 20 mov dx,offset buffer 21 mov cx,1 22 mov ah,40h 23 int 21h 24 endm 25 ;------------------------------------------------ 26 .386P 27 ;------------------------------------------------- 28 dseg segment use16 29 busnum dw 0000h ;总线号0 - 00FFh 30 devnum dw 001fh ;设备号0 - 001Fh 31 funnum dw 0007h ;功能号0 - 0007h 32 regnum dw 00ffh ;寄存器0 - 00FFh 33 ; 34 config_addr dd 00000000h ;用来暂存eax中的地址 35 buff_num db 'bus:device:function:' 36 ; 37 config_data dd 00000000h ;用来存放eax中的pci数据 38 fname db '\zpci_config.txt',0 ;文件名 39 buffer db 2 40 dseg ends 41 ;---------------------------------------------------- 42 ;---------------------------------------------------- 43 cseg segment use16 44 assume cs:cseg, ds:dseg 45 start: 46 mov ax,dseg 47 mov ds,ax 48 ; 49 mov dx,offset fname 50 mov cx,0 ;common file 51 mov ah,3ch ;creat file 52 int 21h 53 ; 54 mov bx,ax ;save file handle 55 ; 56 mov busnum,0000h 57 mov devnum,0000h 58 mov funnum,0000h 59 mov regnum,0000h 60 ;----------------------------------------- 61 call print_num ;打印busnum:devnum:funnum = 00:00:00 62 nextrow ;换行 63 nextreg: 64 call pci_read ;读取pci 配置空间 65 cmp regnum,00h 66 jnz continue ;判断不是第一个寄存器 67 cmp ax,0ffffh ;判断设备是否存在 68 jz nextfun ;不存在,跳到下一个fun 69 continue: 70 call writefile 71 add regnum,4 ;只能每次读4个寄存器 72 cmp regnum,00ffh ;判断 73 ja nextfun ;256B 已读完,跳到下一个function 74 jmp nextreg ;否则,读下一个reg 75 nextfun: 76 nextrow 77 ; 78 mov regnum,0000h 79 inc funnum 80 cmp funnum,0007h 81 ja nextdev ;funnum 大于 7,跳到下一个dev 82 call print_num 83 nextrow 84 jmp nextreg 85 nextdev: 86 mov regnum,0000h 87 mov funnum,0000h 88 inc devnum 89 cmp devnum,001fh 90 ja nextbus ;devnum 大于 1fh,跳到下一个bus 91 call print_num 92 nextrow 93 jmp nextreg 94 nextbus: 95 mov regnum,0000h 96 mov funnum,0000h 97 mov devnum,0000h 98 inc busnum 99 cmp busnum,0005h 100 ja endd ;busnum 大于5,跳到结束 101 call print_num 102 nextrow 103 jmp nextreg 104 ;-----------------------结束------------------------ 105 endd: 106 mov ah,3eh ;close file 107 int 21h 108 ; 109 mov ah,4ch ;return DOS 110 int 21h 111 ;--------------------------------------------------- 112 ;-------------------------------------------------- 113 ;函数功能:打印busnum:devnum:funnum 114 print_num proc 115 mov config_addr,eax ;保护eax中的地址 116 ;------------------------------------ 117 mov dx,offset buff_num 118 mov cx,20 119 mov ah,40h 120 int 21h 121 ;----------busnum------------ 122 mov ax,busnum 123 push ax 124 shr al,4 125 call toascii 126 tofile al 127 pop ax 128 call toascii 129 tofile al 130 tofile 2Dh 131 ;----------devnum---------- 132 mov ax,devnum 133 push ax 134 shr al,4 135 call toascii 136 tofile al 137 pop ax 138 call toascii 139 tofile al 140 tofile 2Dh 141 ;-----------funnum--------- 142 mov ax,funnum 143 push ax 144 shr al,4 145 call toascii 146 tofile al 147 pop ax 148 call toascii 149 tofile al 150 ;----------- 151 mov eax,config_addr ;恢复eax 152 ret 153 print_num endp 154 ;------------------------------------------------------ 155 ;---------------------- writefile ---------------------------- 156 ;函数功能: 把eax 中的值写入文件 157 ;入口参数: eax 158 ;出口参数: 无 159 ;所用寄存器和存储单元:ebx,ecx,edx 160 writefile proc 161 mov config_data,eax ;用config_data暂存eax中的pci数据 162 ;--------第一个字节----- 163 push eax 164 shr al,4 165 call toascii 166 tofile al 167 pop eax 168 call toascii 169 tofile al 170 tofile 20h 171 ;--------第二个字节------ 172 mov eax,config_data 173 shr eax,8 174 ; 175 push eax 176 shr al,4 177 call toascii 178 tofile al 179 pop eax 180 call toascii 181 tofile al 182 tofile 20h 183 ;--------第三个字节------- 184 mov eax,config_data 185 shr eax,16 186 ; 187 push eax 188 shr al,4 189 call toascii 190 tofile al 191 pop eax 192 call toascii 193 tofile al 194 tofile 20h 195 ;--------第四个字节--------- 196 mov eax,config_data 197 shr eax,24 198 ; 199 push eax 200 shr al,4 201 call toascii 202 tofile al 203 pop eax 204 call toascii 205 tofile al 206 tofile 20h 207 ret 208 writefile endp 209 ;--------------------------------------------------- 210 ;-----------------------toascii--------------------------- 211 ;子程序名: toascii 212 ;功能: 把al的低4位的值转成ascii码,存入al 213 ;入口参数: al 214 ;出口参数: al 215 toascii proc 216 and al,0fh 217 add al,90h 218 daa 219 adc al,40h 220 daa 221 ret 222 toascii endp 223 ;---------------------------------------------------- 224 ;----------------------pci_read--------------------------- 225 ;子程序名: pci_read 226 ;功能: 根据eax中的地址读取pci的配置空间,并存入eax 227 ;入口参数: busnum、devnum、funnum、regnum 228 ;出口参数: eax 229 ; 230 pci_read proc 231 ;protect register 232 push ebx 233 push dx 234 ;clear 235 xor eax,eax 236 xor ebx,ebx 237 ;enable 238 add eax,1h 239 shl eax,31 240 ;bus number 241 mov ebx,ds:[00] 242 and ebx,0ffh 243 shl ebx,16 244 add eax,ebx 245 ;device number 246 xor ebx,ebx 247 mov ebx,ds:[02] 248 and ebx,0ffh 249 shl ebx,11 250 add eax,ebx 251 ;function number 252 xor ebx,ebx 253 mov ebx,ds:[04] 254 and ebx,0ffh 255 shl ebx,8 256 add eax,ebx 257 ;register 258 xor ebx,ebx 259 mov ebx,ds:[06] 260 and ebx,0ffh 261 add eax,ebx 262 ;read IO 263 mov dx,0cf8h 264 out dx,eax 265 mov dx,0cfch 266 in eax,dx 267 ;resume register 268 pop dx 269 pop ebx 270 ret 271 pci_read endp 272 ;-------------------------------------------- 273 ;---------------------------------------------- 274 cseg ends 275 end start