📄 pci.asm
字号:
.model small
.386p
.code
ORG 100h
Begin:
jmp entry
PCIinfo db '>>>>>> PCI configuration registers information <<<<<<',0dh,0ah,0dh,0ah,
'>>>>>> Use Ctr+Del to input PFA again. <<<<<<',0dh,0ah,0dh,0ah,
'>>>>>> Form: bus:XX, device:XX function: XX <<<<<<',0dh,0ah,0dh,0ah,
'>>>>>> Use Esc to quit. <<<<<<',0dh,0ah,0dh,0ah,'$'
PCIf db 0dh,0ah,' 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ',0dh,0ah,0dh,0ah,'$'
ff db 0dh, 0ah,'$'
wall db '===========================================================', 0dh, 0ah, 0dh, 0ah, '$'
search dword 1 DUP(0)
index dword 255 DUP(0)
dex db 0dh,0ah,'$'
pcifu dword 255 DUP(0)
tembus dword 255 DUP(0)
temdevice dword 255 DUP(0)
temfunction dword 255 DUP(0)
fb db 'input the bus: ',0dh, 0ah,'$'
fd db 'input the device: ',0dh, 0ah,'$'
fun db 'input the function: ',0dh, 0ah,'$'
bus dword 255 DUP(0)
device dword 255 DUP(0)
function dword 255 DUP(0)
f01_d db '?? ','$';,0dh,0ah,0dh,0ah,'$'
f02_d db '?? ','$';,0dh,0ah,0dh,0ah,'$'
f03_d db '?? ','$';,0dh,0ah,0dh,0ah,'$'
f04_d db '?? ','$';,0dh,0ah,0dh,0ah,'$'
f05_d db '?? ','$';,0dh,0ah,0dh,0ah,'$'
comment %
;picfu db '?? '
f01_m db 'AtRateOK.....................$'
f01_d db ' ?? ',0dh,0ah
f02_d db '?? ',0dh;,0ah
f03_d db '?? ',0dh;,0ah
f04_d db '?? ',0dh,0ah
f05_d db '?? ',0dh,0ah
%
entry:
mov ah, 09h
lea dx, PCIinfo
int 21h
input:
;-------------------------------
mov eax, 80000000h
; push eax
mov ecx, 0
;====================================
mov ah, 09h
lea dx, fb
int 21h
mov ah, 3fh
mov bx, 0
mov cx, 255
mov dx, offset bus
int 21h
mov bl, 0
mov eax, bus
jmp Tch
Tdev:
and eax, 000000ffh
mov bus, eax
mov ah, 09h
lea dx, fd
int 21h
mov ah, 3fh
mov bx, 0
mov cx, 255
mov dx, offset device
int 21h
mov bl, 1
mov eax, device
jmp Tch
Tfun:
and eax, 000000ffh
mov device, eax
mov ah, 09h
lea dx, fun
int 21h
mov ah, 3fh
mov bx, 0
mov cx, 255
mov dx, offset function
int 21h
mov bl,2
mov eax, function
;;==================ch=====================
Tch:
push ax
shr al, 4
cmp al, 3h
je three_al2
four_al2:
pop ax
and al, 0fh
add al, 9h
jmp forah2
three_al2:
pop ax
and al, 0fh
forah2:
push ax
shr ah,4
cmp ah, 3h
je three_ah2
four_ah2:
pop ax
and ah, 0fh
add ah, 9h
jmp next2
three_ah2:
pop ax
and ah, 0fh
next2:
shl ah, 4
or ah,al
shr ax, 8
rol al, 4
shl eax, 8
or eax, ebx
rol ax, 8
cmp bl, 0
je Tdev
cmp bl, 1
je Tfun
and eax, 000000ffh
mov function, eax
;==========================================
shl bus, 16
shl device, 11
shl function, 8
mov eax, 80000000h
or eax, bus
or eax, device
or eax, function
push eax
jmp doinput
;=====================================
;L0:
;sub eax, 00000010h
L1:
mov ah, 10h
int 16h
cmp al, 1Bh
je E
cmp ah, 51h
je down ;down
cmp ah, 49h
je up ;up
cmp ah, 93h
je input
jmp L1
;=================================
;=================================4:10test
up:
pop eax
sub eax, 00000100h
push eax
doupsearch:
mov search, 1h
pop eax
cmp eax, 80000000h;
je again_up;
sub eax, 00000100h
push eax
jmp do
down:
pop eax
sub eax, 00000100h
push eax
doinc:
mov search, 0h
pop eax
cmp eax, 80ffff00h
je again
add eax, 00000100h
push eax
jmp do
again_up:
mov eax, 80ffff00h
push eax
jmp do
again:
mov ecx, 0
mov eax, 80000000h
push eax
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
do:
pop eax
push eax
mov dx, 0cf8h
out dx, eax
mov dx, 0cfch;;bx>dx
in eax, dx
out dx, eax
cmp ax, 0ffffh
jne nothing
cmp search, 1h
je backup
backdown:
jmp doinc
backup:
jmp doupsearch
nothing:
pop eax
;=======================================
doinput:
push eax
mov ah, 09h
lea dx, wall
int 21h
pop eax
push eax
push edx
mov edx, eax
mov ebx, eax
shr edx, 16
mov al, dh
lea di, f01_d
call Hex2ascii
mov al, dl
lea di, f02_d
call Hex2ascii
mov edx, ebx
mov dl, dh
and dl, 07h
shr dh, 3
mov al, dh
lea di, f03_d
call Hex2ascii
mov al, dl
lea di, f04_d
call Hex2ascii
mov ah, 09h
lea dx, f01_d
int 21h
mov ah, 09h
lea dx, f02_d
int 21h
mov ah, 09h
lea dx, f03_d
int 21h
mov ah, 09h
lea dx, f04_d
int 21h
mov ah, 09h
lea dx, ff
int 21h
pop edx
pop eax
;========================================
;---------- get index ----------
get_index:
;;======================
push eax
mov ah, 09h
lea dx, PCIf
int 21h
pop eax
;;======================
mov pcifu, 0
mov index, 0
mov dex, 0
push eax
push eax
push edx
mov edx, pcifu
mov al, dl
lea di, f05_d
call Hex2ascii
mov ah, 09h
lea dx, f05_d
int 21h
pop edx
pop eax
jmp loop1
loop3:
mov ah, 09h
lea dx, ff
int 21h
mov index, 0
pop eax
add eax, 00000010h
add dex, 00000001h
push eax
cmp dex, 16
je L1
;;;;;;;;;;;;;;;;;;;;;;;;;;
push eax
push eax
and eax, 000000f0h
lea di, f05_d
call Hex2ascii
mov ah, 09h
lea dx, f05_d
int 21h
;pop edx
pop eax
;;;;;;;;;;;;;;;;;;;;;;;;;;;
jmp loop1
loop2:
pop eax
add eax, 00000004h
add index, 00000001h
cmp index,4
je loop3
loop1:
push eax
mov dx, 0cf8h
out dx, eax
mov dx, 0cfch
in eax, dx
out dx, eax
print:
mov edx, eax
mov ebx, eax
shr edx, 16
mov al, dh
lea di, f04_d
call Hex2ascii
mov al, dl
lea di, f03_d
call Hex2ascii
mov edx, ebx
mov al, dh
lea di, f02_d
call Hex2ascii
mov al, dl
lea di, f01_d
call Hex2ascii
mov ah, 09h
lea dx, f01_d
int 21h
mov ah, 09h
lea dx, f02_d
int 21h
mov ah, 09h
lea dx, f03_d
int 21h
mov ah, 09h
lea dx, f04_d
int 21h
jmp loop2
E:
;---------- PCI config ----------
;;;;;;;;;;END;;;;;;;;;;
mov ah, 4Ch
int 21h
jmp $
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Hex2ascii proc ; Entry:al=Hex, Return:[di]..[di+1]=ASCII
pusha
mov ah, 0
mov cl, 10h
div cl ; ax / cl = al ... ah
add al, '0'
cmp al, '9'
jna @f
add al, 07h
@@:
stosb
add ah, '0'
cmp ah, '9'
jna @f
add ah, 07h
@@:
xchg ah, al
stosb
popa
ret
Hex2ascii endp
end begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -