📄 asus1.asm
字号:
;find out all PCI device,and list it out
;list item contain num,Bus num,device number,function num,venderID,DeviceID
.model small
.data
TITLE1 DB 'Number Bus Dev Fun VenderID DeviceID$'
LINE DB '-----------------------------------------------------------$'
BUS DB 0 ;8 bit <=255
DEV DB 0 ;5 bit <=31
FUN DB 0 ;3 bit <=7
COUNT DW 0
.code
DISP MACRO VAR
MOV DL,VAR
MOV AH,6
INT 21H
ENDM
;This Macro disp some space,and the parameter SpaceNum include the number
DISPSPACE MACRO SpaceNum
PUSH CX
MOV CL,SpaceNum
.WHILE 1 ;loop SpaceNum times,
DISP ' ' ;each time display one space.
DEC CL
.BREAK .IF CL == 0
.ENDW
POP CX
ENDM
.386
.startup
LEA DX,TITLE1
MOV AH,9
INT 21H
DISP 0DH
DISP 0AH
MOV DX,OFFSET LINE
MOV AH,9
INT 21H
DISP 0DH
DISP 0AH
START:
CALL ADRESSGEN
MOV DX,0CF8H
OUT DX,EAX
MOV DX,0CFCH
IN EAX,DX
.IF AX != 0FFFFH
PUSH EAX
INC COUNT
DISP ' '
MOV AX,COUNT
CALL DISPAX
DISPSPACE 4
MOV AH,0
MOV AL,BUS
CALL DISPAX
DISPSPACE 6
MOV AH,0
MOV AL,DEV
CALL DISPAX
DISPSPACE 6
MOV AH,0
MOV AL,FUN
CALL DISPAX
DISPSPACE 8
POP EAX
CALL DISPAX
DISPSPACE 7
MOV CL,16
ROL EAX,CL
CALL DISPAX
DISP 0DH
DISP 0AH
.ENDIF
INC FUN
.IF FUN>7
MOV FUN,0
JMP ADDDEV
.ENDIF
JMP START
ADDDEV:
INC DEV
.IF DEV>31
MOV DEV,0
JMP ADDBUS
.ENDIF
JMP START
ADDBUS:
INC BUS
.IF BUS!=0
JMP START
.ENDIF
.exit
DISPAX PROC NEAR
PUSH CX
PUSH DX
MOV CL,4
MOV CH,4
DISPAX1:
ROL AX,CL
PUSH AX
AND AL,0FH
ADD AL,30H
CMP AL,'9'
JBE DISPAX2
ADD AL,7
DISPAX2:
MOV AH,2
MOV DL,AL
INT 21H
POP AX
DEC CH
JNZ DISPAX1
POP DX
POP CX
RET
DISPAX ENDP
ADRESSGEN PROC NEAR
PUSH CX
MOV CL,16
MOV AH,80H
MOV AL,BUS
SHL EAX,CL
MOV CL,3
XOR AH,AH
MOV AH,DEV
ROL AH,CL
MOV CL,FUN
OR AH,CL
MOV AL,0
POP CX
RET
ADRESSGEN ENDP
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -