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