欢迎使用CSDN-markdown编辑器
2016-05-09 14:11
169 查看
微机原理实验 系列
实验二 PCI设备操作
(一)配置空间读取
示例代码在书上,粘一下在此~
STACK SEGMENT PARA STACK DW 128H DUP(0) STACK ENDS DATA SEGMENT NOFOUND DB 'NOT FOUND!',0DH,0AH,'$' IO DB 0DH,0AH,'IO ADDRESS IS: $' DATA ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AH,0B1H MOV AL,2 MOV CX,9050H MOV DX,10B5H MOV SI,0 INT 1AH CMP AH,0 JZ GOT MOV DX,OFFSET NOFOUND MOV AH,9 INT 21H JMP GOUT GOT: MOV AX,BX CALL DISP MOV DL,0DH MOV AH,2 INT 21H MOV DL,0AH INT 21H MOV DI,0 LOOP1: MOV AX,0B109H INT 1AH MOV AX,CX CALL DISP MOV DL,' ' MOV AH,2 INT 21H INC DI INC DI CMP DI,40H JL LOOP1 MOV DX,OFFSET IO MOV AH,9 INT 21H MOV AX,0B109H MOV DI,1CH INT 1AH AND CX,0FFFEH MOV AX,CX CALL DISP GOUT: MOV AH,4CH INT 21H DISP PROC NEAR PUSH BX PUSH CX MOV BX,AX MOV CX,4 LLOOP1: MOV AX,BX CALL DISP2 PUSH CX MOV CL,4 SHL BX,CL POP CX LOOP LLOOP1 POP CX POP BX RET DISP ENDP DISP2 PROC NEAR PUSH DX PUSH CX AND AH,0F0H MOV CL,4 SHR AH,CL MOV DL,AH CMP DL,9 JLE NUM ADD DL,7 NUM: ADD DL,30H MOV AH,02H INT 21H POP CX POP DX RET DISP2 ENDP CODE ENDS END START
(二)列举全部PCI设备
我觉得注释挺详细的了
STACK SEGMENT PARA STACK DW 128H DUP(0) STACK ENDS DATA SEGMENT DATA ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK,DS:DATA START: MOV AX,DATA MOV DS,AX MOV BX,0 ;BX为循环变量,也是PCI BIOS系统调用的参数 NEXT: CMP BX,0900H JNZ NOEXIT ;枚举总线号、设备号和功能号并进入循环内部 MOV AX,4C00H ;循环结束 INT 21H NOEXIT: MOV AX,0B109H MOV DI,0 INT 1AH ;参数为BX,DI = 0的读配置字系统调用 MOV AX,CX ;CX中存放着读出的配置字,即供应商ID CMP AX,0FFFFH JZ LABEL1 ;若供应商ID为0FFFFH,说明插槽没有安装板卡,此时BX+1,并返回循环开始 CALL DISP ;若供应商ID不为0FFFFH,则输出Vendor ID MOV DL,' ' MOV AH,2 INT 21H ;输出一个空格 MOV AX,0B109H MOV DI,2 INT 1AH ;参数仍为BX,DI = 2的读配置字系统调用 MOV AX,CX ;CX中存放着读出的配置字,此次是设备ID ;CMP AX,0FFFFH ;JZ LABEL1 CALL DISP ;输出Device ID MOV AH,2 MOV DL,0DH INT 21H MOV DL,0AH INT 21H ;输出回车,即换行 MOV CX,BX AND CX,07H ;取出BX的低三位,即功能号 CMP CX,0 ;判断功能号是否为0 JNZ LABEL1 ;若功能号不为0,说明该设备是多功能设备,所以顺序枚举BX,BX+1并返回循环开始 MOV AX,0B108H ;若功能号为0,则需读取其首部类型进行判断 MOV DI,0EH ;READ HEADER TYPE INT 1AH ;参数为BX,DI = 0EH的读配置字节的系统调用 MOV AL,CL ;CL中存放着读出的配置字节,即首部类型 AND AL,80H CMP AL,0 ;判断首部类型最高位是否为0 JZ LABEL2 ;若为0,说明该设备为单功能设备,无需枚举8个功能号,所以BX+8并返回循环开始 LABEL1: INC BX JMP NEXT LABEL2: ADD BX,8 JMP NEXT DISP PROC NEAR ;将AX寄存器里的数据转化为ASCII码并显示 PUSH BX PUSH CX MOV BX,AX MOV CX,4 LLOOP1: MOV AX,BX CALL DISP2 PUSH CX MOV CL,4 SHL BX,CL POP CX LOOP LLOOP1 POP CX POP BX RET DISP ENDP DISP2 PROC NEAR ;显示AH的高四位 PUSH DX PUSH CX AND AH,0F0H MOV CL,4 SHR AH,CL MOV DL,AH CMP DL,9 JLE NUM ADD DL,7 NUM: ADD DL,30H MOV AH,02H INT 21H POP CX POP DX RET DISP2 ENDP CODE ENDS END START
相关文章推荐
- Android 文件读写工具类
- C#多线程-不同线程之间通过事件委托封送调用方法
- Sublime text常用插件
- iMindMap思维导图能替我们完成哪些任务
- 使用maven命令来分析jar包之间的依赖关系
- CSU 1725 加尔鲁什·地狱咆哮对阵虚灵大盗拉法姆(dp)
- IPv4下通过DNS64 NAT64访问IPv6
- UML之用例图分析(关联、泛化、包含、扩展)
- webview的使用
- 第7周 C语言程序设计(新2版) 例题1 统计输入的字符数
- C语言正则表达式详解 regcomp() regexec() regfree()详解
- Unity-3D 粒子光圈效果
- Http请求中Content-Type讲解以及在Spring MVC中的应用
- consul的安装配置 一centos7环境
- Protocol Buffer使用
- 文章标题
- HDU 3394 Railway (点双联通+圈内判边数)
- Java类加载机制?
- fopen()函数参数
- 由一次程序崩溃引起的对new表达式的再次学习