码迷,mamicode.com
首页 > 其他好文 > 详细

汇编读取PCI配置空间

时间:2015-08-31 21:05:15      阅读:584      评论:0      收藏:0      [点我收藏+]

标签:

学习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

 

汇编读取PCI配置空间

标签:

原文地址:http://www.cnblogs.com/nju347/p/4773784.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!