x86_64 nasm跳到错误的位置

时间:2019-02-11 13:29:42

标签: operating-system nasm x86-64

我正在研究枚举PCI总线的代码,但是发现每个设备上的循环的jz语句跳转到错误的位置(甚至没有标签)。每次cmp ax, 0xffff不相等时,应调用一次寄存器函数,且不止一次。只会被调用一次。

register:                               ; eax = edi = config offset of the function
    mov dx, ADDR_PRT
    add eax, 0x08
    in eax, dx
    shr eax, 16
    mov dx, ax
    call checkpoint
    mov eax, edi
rmsd:   cmp dx, 0x0601                  ; mass storage devices
    je ahci_register                ; register an AHCI controller
    ret                             ; couldn't find it, ignore it


pci_init:
    mov edi, 0x80000000
ilp0:   mov rax, rdi
    mov dx, ADDR_PRT
    out dx, eax
    mov dx, DATA_PRT
    in eax, dx
    cmp ax, 0xffff
    je ilp0c0
    push rdi
    mov rax, rdi
    call register
    pop rdi
ilp0c0: add rdi, 0x100
    test edi, 0xff000000            ; code jupms to the line before this
    jz ilp0
    ret

代码被组装为PE文件,然后使用lld-link链接并使用EFI运行。

0 个答案:

没有答案