首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何利用pci功能id识别设备

如何利用pci功能id识别设备
EN

Stack Overflow用户
提问于 2022-03-29 01:08:34
回答 1查看 171关注 1票数 0

如何通过pci功能标识识别设备?这是我的密码:

我尝试访问34h并检查第一个循环中是否存在功能id (如果存在),它指向下一个指针,但是在获取指针和放置地址的步骤中似乎存在一些问题。

“”“

代码语言:javascript
运行
复制
    push eax
    push edi
    push esi

    mov cx,100
    
    ;mov edi,[esi]      
    add edi,52     ;access 34h
    
lopreg:     
    mov eax,edi    ;read
    mov dx,0cf8h
    out dx,eax
    mov dx,0cfch
    in eax,dx
   
    cmp cx,100    ;first time 
    je first
    
    cmp ah,10
    jne nextreg
    jmp ispcie
    
first:
    cmp ah,0
    je  ending
    sub edi,52
    movzx bx,ah
    add di,bx

    loop lopreg
    jmp ending
    
ispcie:
    call set_cur        
    mov ah,09h
    lea dx,regmem        ;print pcie
    int 21h
    jmp ending
    
nextreg:
    cmp al,0
    je ending
    movzx bx,al ;
    add di,bx
    loop lopreg
ending: 
    pop esi
    pop edi
    pop eax
    ret

“”“

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-30 06:19:14

编写这个答案的前提是,该代码正在寻找PCI功能。

这段代码有几个问题。

在capability.

  • The标签上的
  1. ,它应该使用al而不是ah来确定pointer功能的第一个first功能ID的偏移量是10小时,而不是10。在读取每个能力标头之后,
  2. al包含能力id,ah包含下一个指针。所以cmp ah, 10应该是cmp al, 10h
  3. nextreg标签上,它应该使用ah而不是al来确定下一个nextreg迭代的偏移量,它在不移除前一个偏移量的情况下将bx添加到di中。< code >H 222H 123初始化到什么d24,但是如果它没有设置位31,那么这段代码根本就不会读取PCI配置空间。H 225G 226

这应该是可行的:

代码语言:javascript
运行
复制
    mov cx,100
    
    ;mov edi,[esi]      
    add edi,52     ;access 34h
    
lopreg:     
    mov eax,edi    ;read
    mov dx,0cf8h
    out dx,eax
    mov dx,0cfch
    in eax,dx
   
    cmp cx,100    ;first time 
    je first
    
    cmp al,10h
    jne nextreg
    jmp ispcie
    
first:
    cmp al,0
    je  ending
    sub edi,52
    movzx bx,al
    add di,bx

    loop lopreg
    jmp ending
    
ispcie:
    call set_cur        
    mov ah,09h
    lea dx,regmem        ;print pcie
    int 21h
    jmp ending
    
nextreg:
    cmp ah,0
    je ending
    sub di, bx
    movzx bx,ah
    add di,bx
    loop lopreg

ending:

  1. 更好的方法是将原始地址保留在edi中而不更改它,并对每个新的偏移量使用lea eax, [edi+ebx]。

  1. 没有必要使用ecx作为循环计数器,逻辑也有点复杂。它可以变得更清晰一些。--

我会这样写:

代码语言:javascript
运行
复制
    lea eax,[edi+34h]     
    mov dx,0cf8h
    out dx,eax
    mov dx,0cfch
    in al,dx              ; read offset of first capability
    cmp al,0
    je ending
    movzx ebx,al

lopreg:     
    lea eax,[edi+ebx]     ; offset of next capability is in ebx
    mov dx,0cf8h
    out dx,eax
    mov dx,0cfch
    in eax,dx             ; read capability header

    cmp al,10h            ; check if it is the PCI Express capability
    je ispcie

nextreg:
    cmp ah,0              ; check if it is the end of the capability list
    je ending
    movzx ebx, ah         ; set up ebx with the offset of the next capability
    jmp lopreg

ispcie:
    ; base of device PCI config space is in edi
    ; offset of PCI Express Capability is in ebx
    ...

ending:

(我不知道set_cur和regmem是什么,所以我没有尝试编写这部分代码。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71655343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档