Funktion mit veränderbaren Parametern realisieren?



  • Hi,
    ich habe mir eine kleine Funktion geschrieben, die den PCI Bus nach Geräten scannen soll. Zum Test habe ich einfach mal Bus 0, Dev 0 Func 0 scannen lassen. Funktioniert auch wunderbar:

    scan_pci_bus:
        mov r9, scan_pci_msg
        call print.line
    
    start_scan:
        mov eax, 0x80000000
        or eax, 0x00 << 16  ;Bus
        or eax, 0x00 << 11  ;Dev
        or eax, 0x00 << 8   ;Func
        mov cl, 0x00 & 0xFC ;Offset (Vendor und Device ID lesen)
        mov dx, 0xCF8
        out dx, eax
    
        mov dx, 0xCFC
        in eax, dx
    
        cmp eax, 0xFFFFFFFF
        je pci_next
    
        mov r9, found_pci_dev_msg
        call print.line
    
    pci_next:
        ;Parameter verändern
        jmp start_scan
    

    Wie man erkennen kann, möchte ich die Parameter (Bus, Dev, Func) gerne ändern, um so innerhalb einer Schleife alle möglichen Bus, Dev und Func Kombinationen nach Geräten abscannen zu können. Leider weiß ich nicht genau wie ich dies realisieren kann und hoffe auf den ein oder anderen Hinweis von euch.

    Achja: Als Assembler kommt nasm zum Einsatz.

    Vielen Dank schonmal im Vorfeld für eure Mühen 🙂



  • scan_pci_bus:
        mov r9, scan_pci_msg
        call print.line
    
        xor eax, eax
        or eax, 0x00 << 16  ;Bus
        or eax, 0x00 << 11  ;Dev
        or eax, 0x00 << 8   ;Func
    start_scan:
        and eax, 0x00FFFFFF
        or  eax, 0x80000000
    
        mov cl, 0x00 & 0xFC ;Offset (Vendor und Device ID lesen)
        mov dx, 0xCF8
        out dx, eax
    
        mov dx, 0xCFC
        in eax, dx
    
        cmp eax, 0xFFFFFFFF
        je pci_next
    
        mov r9, found_pci_dev_msg
        call print.line
    
    pci_next:
        ;Parameter verändern
        xor eax, eax
        or eax, 0x00 << 16  ;Bus
        or eax, 0x00 << 11  ;Dev
        or eax, 0x00 << 8   ;Func
        jmp start_scan
    

Anmelden zum Antworten