X86 APM处于保护模式?

X86 APM处于保护模式?,x86,nasm,osdev,protected-mode,X86,Nasm,Osdev,Protected Mode,我正在尝试在我的操作系统上实现APM。虽然我可以在实模式下启用APM(使用int 0x15),但如何在保护模式下切换电源状态?我需要跳转到实模式还是vm86模式?我读了文档,感到更加困惑 此接口允许受保护模式APM驱动程序调用APM BIOS功能无需首先切换到实际或 虚拟-86模式 那么,如果处于保护模式,如何调用0x15中断(以使用APM函数)?我不能那样做 我知道APM有点过时,但ACPI太过复杂了,我现在只想简单一些 顺便说一句,这是我目前的代码: extern print_string

我正在尝试在我的操作系统上实现APM。虽然我可以在实模式下启用APM(使用int 0x15),但如何在保护模式下切换电源状态?我需要跳转到实模式还是vm86模式?我读了文档,感到更加困惑

此接口允许受保护模式APM驱动程序调用APM BIOS功能无需首先切换到实际或 虚拟-86模式

那么,如果处于保护模式,如何调用0x15中断(以使用APM函数)?我不能那样做

我知道APM有点过时,但ACPI太过复杂了,我现在只想简单一些

顺便说一句,这是我目前的代码:

extern print_string
global set_power_stateoff

enableAPM:
    ; Installation check
    mov ah, 0x53
    mov al, 0x00
    xor bx, bx
    int 0x15
    jc .error
    ; Conecting to protected mode APM interface
    mov ah, 0x53
    mov al, [0x3]
    xor bx, bx
    int 0x15
    jc .error
    ; Enabling power mngm. for all devices
    mov al, 0x53
    mov ah, 0x08
    mov bx, 0001h
    mov cx, 0001h
    int 0x15
    jc .error ; if carry = 1, we have an error
    .error:
    mov si, apmerrno
    call print_string
    ret

set_power_stateoff:
    ; All devices off
    mov ah, 0x53
    mov al, 0x07
    mov bx, 0x0001
    mov cx, [0x0003]
    int 0x15

section .data:
apmerrno: db "APM interface not supported! :(", 0x0A, 0x0D, 0
编辑:我发现一种叫做“BIOS32”的东西,用于从保护模式调用BIOS中断。据我所知,它可以用于APM procmode调用?

;“int 0x15,ax=0x5303”BIOS函数返回您需要用于设置三个连续描述符(例如在GDT中)的信息,以及32位入口点其中一个区域的偏移量。创建描述符后,您将调用所创建的第一个描述符所描述的代码段中的指定入口点(例如,使用
调用远dword[…]
),其行为与实模式中的“int 0x15”相同(在相同寄存器中使用相同的输入和输出参数等)


注意:对于您发布的代码,
mov-al,[0x3]
是一个bug,应该是
mov-al,0x03
(但我会将它与前面的说明结合起来,例如
mov-ax,(0x53官方规范的标题是“
高级电源管理(APM)BIOS接口规范
”。您应该能够将规范标题剪切并粘贴到搜索引擎中,并找到修订版1.2(从1996年起),其中包括所有内容的说明(例如功能及其输入/输出参数)和一些附录(例如“附录D-APM驱动程序注意事项”)