DOS下读取PCI配置空间信息的汇编程序(通过IOCF8/IOCFC)
汇编程序编写的读取PCI配置空间信息的代码(通过IOCF8/IOCFC):
;------------------------------------------------
;功能: 读取PCI 配置信息,存入文件zpci_config.txt
;环境: DOS + MASM5
;时间: 2015/08
;说明: 通过端口CF8h / CFCh 来读取
;
;---------------------自定义宏结构-------------------
;功能: 在文件中换行
nextrow macro
mov buffer ,0dh
mov buffer+,0ah
mov dx,offset buffer
mov cx,
mov ah,40h
int 21h
endm
;功能:把ascii 表示的字符写入文件
tofile macro ascii
mov buffer,ascii
mov dx,offset buffer
mov cx,
mov ah,40h
int 21h
endm
;------------------------------------------------
.386P
;-------------------------------------------------
dseg segment use16
busnum dw 0000h ;总线号0 - 00FFh
devnum dw 001fh ;设备号0 - 001Fh
funnum dw 0007h ;功能号0 - 0007h
regnum dw 00ffh ;寄存器0 - 00FFh
;
config_addr dd 00000000h ;用来暂存eax中的地址
buff_num db 'bus:device:function:'
;
config_data dd 00000000h ;用来存放eax中的pci数据
fname db '\zpci_config.txt', ;文件名
buffer db
dseg ends
;----------------------------------------------------
;----------------------------------------------------
cseg segment use16
assume cs:cseg, ds:dseg
start:
mov ax,dseg
mov ds,ax
;
mov dx,offset fname
mov cx, ;common file
mov ah,3ch ;creat file
int 21h
;
mov bx,ax ;save file handle
;
mov busnum,0000h
mov devnum,0000h
mov funnum,0000h
mov regnum,0000h
;-----------------------------------------
call print_num ;打印busnum:devnum:funnum = 00:00:00
nextrow ;换行
nextreg:
call pci_read ;读取pci 配置空间
cmp regnum,00h
jnz continue ;判断不是第一个寄存器
cmp ax,0ffffh ;判断设备是否存在
jz nextfun ;不存在,跳到下一个fun
continue:
call writefile
add regnum, ;只能每次读4个寄存器
cmp regnum,00ffh ;判断
ja nextfun ;256B 已读完,跳到下一个function
jmp nextreg ;否则,读下一个reg
nextfun:
nextrow
;
mov regnum,0000h
inc funnum
cmp funnum,0007h
ja nextdev ;funnum 大于 7,跳到下一个dev
call print_num
nextrow
jmp nextreg
nextdev:
mov regnum,0000h
mov funnum,0000h
inc devnum
cmp devnum,001fh
ja nextbus ;devnum 大于 1fh,跳到下一个bus
call print_num
nextrow
jmp nextreg
nextbus:
mov regnum,0000h
mov funnum,0000h
mov devnum,0000h
inc busnum
cmp busnum,0005h
ja endd ;busnum 大于5,跳到结束
call print_num
nextrow
jmp nextreg
;-----------------------结束------------------------
endd:
mov ah,3eh ;close file
int 21h
;
mov ah,4ch ;return DOS
int 21h
;---------------------------------------------------
;--------------------------------------------------
;函数功能:打印busnum:devnum:funnum
print_num proc
mov config_addr,eax ;保护eax中的地址
;------------------------------------
mov dx,offset buff_num
mov cx,
mov ah,40h
int 21h
;----------busnum------------
mov ax,busnum
push ax
shr al,
call toascii
tofile al
pop ax
call toascii
tofile al
tofile 2Dh
;----------devnum----------
mov ax,devnum
push ax
shr al,
call toascii
tofile al
pop ax
call toascii
tofile al
tofile 2Dh
;-----------funnum---------
mov ax,funnum
push ax
shr al,
call toascii
tofile al
pop ax
call toascii
tofile al
;-----------
mov eax,config_addr ;恢复eax
ret
print_num endp
;------------------------------------------------------
;---------------------- writefile ----------------------------
;函数功能: 把eax 中的值写入文件
;入口参数: eax
;出口参数: 无
;所用寄存器和存储单元:ebx,ecx,edx
writefile proc
mov config_data,eax ;用config_data暂存eax中的pci数据
;--------第一个字节-----
push eax
shr al,
call toascii
tofile al
pop eax
call toascii
tofile al
tofile 20h
;--------第二个字节------
mov eax,config_data
shr eax,
;
push eax
shr al,
call toascii
tofile al
pop eax
call toascii
tofile al
tofile 20h
;--------第三个字节-------
mov eax,config_data
shr eax,
;
push eax
shr al,
call toascii
tofile al
pop eax
call toascii
tofile al
tofile 20h
;--------第四个字节---------
mov eax,config_data
shr eax,
;
push eax
shr al,
call toascii
tofile al
pop eax
call toascii
tofile al
tofile 20h
ret
writefile endp
;---------------------------------------------------
;-----------------------toascii---------------------------
;子程序名: toascii
;功能: 把al的低4位的值转成ascii码,存入al
;入口参数: al
;出口参数: al
toascii proc
and al,0fh
add al,90h
daa
adc al,40h
daa
ret
toascii endp
;----------------------------------------------------
;----------------------pci_read---------------------------
;子程序名: pci_read
;功能: 根据eax中的地址读取pci的配置空间,并存入eax
;入口参数: busnum、devnum、funnum、regnum
;出口参数: eax
;
pci_read proc
;protect register
push ebx
push dx
;clear
xor eax,eax
xor ebx,ebx
;enable
add eax,1h
shl eax,
;bus number
mov ebx,ds:[]
and ebx,0ffh
shl ebx,
add eax,ebx
;device number
xor ebx,ebx
mov ebx,ds:[]
and ebx,0ffh
shl ebx,
add eax,ebx
;function number
xor ebx,ebx
mov ebx,ds:[]
and ebx,0ffh
shl ebx,
add eax,ebx
;register
xor ebx,ebx
mov ebx,ds:[]
and ebx,0ffh
add eax,ebx
;read IO
mov dx,0cf8h
out dx,eax
mov dx,0cfch
in eax,dx
;resume register
pop dx
pop ebx
ret
pci_read endp
;--------------------------------------------
;----------------------------------------------
cseg ends
end start
DOS下读取PCI配置空间信息的汇编程序(通过IOCF8/IOCFC)的更多相关文章
- DOS下读取spd信息的汇编程序(通过SMBus)
汇编程序编写的读取spd信息的代码: ;----------------------------------------------------------- ;功能: 通过SMbus 读取内存的SP ...
- SpringBoot(十三)-- 不同环境下读取不同配置
一.场景: 在开发过程中 会使用 开发的一套数据库,测试的时候 又会使用测试的数据库,生产环境中 又会切换到生产环境中.常用的方式是 注释掉一些配置,然后释放一下配置.SpringBoot提供了在不同 ...
- DOS下读取smbios的汇编程序(通过搜索memory)
汇编程序编写的读取smbios的代码: ;------------------------------------------------- ;功能: 读取SMBIOS 的Entry Point ,并 ...
- [转]WinForm和WebForm下读取app.config web.config 中邮件配置的方法
本文转自:http://blog.csdn.net/jinbinhan/article/details/1598386 1. 在WinForm下读取 App.config中的邮件配置语句如下: Con ...
- dos下的edit命令使用详解
dos下的edit命令使用详解 来源:网络 作者:未知 edit命令是一个简单的编辑软件,我们经常用它来编辑一些程序和批处理文件. 比如,我想在c盘根目录下编辑一个简单的批处理文件,要求无论当前盘和当 ...
- PCI配置空间简介
一.PCI配置空间简介 PCI有三个相互独立的物理地址空间:设备存储器地址空间.I/O地址空间和配置空间.配置空间是PCI所特有的一个物理空间.由于PCI支持设备即插即用,所以PCI设备不占用固定的内 ...
- Linux下Redis服务器安装配置
说明:操作系统:CentOS1.安装编译工具yum install wget make gcc gcc-c++ zlib-devel openssl openssl-devel pcre-devel ...
- [C] zlstdint(让VC、TC等编译器自动兼容C99的整数类型)V1.0。支持Turbo C++ 3等DOS下的编译器
作者:zyl910 以前我曾为了让VC++等编译器支持C99的整数类型,便编写了c99int库来智能处理(http://www.cnblogs.com/zyl910/p/c99int_v102.htm ...
- CentOS下Redis服务器安装配置
说明: 操作系统:CentOS 1.安装编译工具 yum install wget make gcc gcc-c++ zlib-devel openssl openssl-devel pcre-de ...
随机推荐
- abap调用代码块
1:abap 调用代码块. *&---------------------------------------------------------------------* *& Re ...
- 根据设备宽高设置View的大小
得到设备屏幕宽高: WindowManager wManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); ...
- bat脚本简单命令
1.if 判断 (1.1)判断字符串是否为空: if "%var1%" == " " ( echo null) else(echo not null ) (1. ...
- [LeetCode] 876. Middle of the Linked List_Easy tag: Linked List ** slow, fast pointers
Given a non-empty, singly linked list with head node head, return a middle node of linked list. If t ...
- [xdoj]1303jlz的刷题黑科技
先分析复杂度,给的数据是1e5的,那么我们至少需要一个nlogn的算法才可以.由于答案是一个数字,首先想到是二分法(一般答案是一个数字都可以通过二分法来完成) 下面是思路: 1.可以完成题目的条件是, ...
- IdentityServer4:IdentityServer4+API+Client实践OAuth2.0客户端模式(1)
一.OAuth2.0 1.OAuth2.0概念 OAuth2.0(Open Authorization)是一个开放授权协议:第三方应用不需要接触到用户的账户信息(如用户名密码),通过用户的授权访问用户 ...
- spring之拦截器
拦截器 实现HandlerInterceptor接口:注册拦截器<mvc:inteceptors> spring和springMVC父子容器的关系 在spring整体框架的核心概念中,容器 ...
- mysql数据库表设计小数类型
float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位)double:双精度实型,含字节数为8,64bit数值范围-1.7E308~1.7E308(15个有效 ...
- Oracle数据库分区相干知识点
Partition Characteristics:1.Partition Key;2.Partitioning Strategies Partitioning Strategies:1. range ...
- Rpgmakermv(16) YEP MainmenuManager
---------------------------------------------------------------------------------------------------- ...