我正在尝试对我的操作系统实施APM。虽然可以在实模式(使用int 0x15)中启用APM,但如何在保护模式下切换电源状态?我需要跳到实模式还是vm86模式?我阅读了文档,然后感到更加困惑
此接口允许受保护模式APM驱动程序调用APM BIOS功能无需,首先切换到 real或 虚拟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调用吗?
答案 0 :(得分:2)
据我所知; BIOS函数“ int 0x15,ax = 0x5303”返回用于设置三个连续描述符(例如,在GDT中)和32位入口点在这些区域之一中的偏移量所需的信息。创建描述符之后,您将在创建的第一个描述符描述的代码段中调用指定的入口点(例如,使用call far dword [ ..]
),其行为与“ int 0x15”相同实模式(在相同的寄存器中具有相同的输入和输出参数,等等)。
注意:对于您发布的代码,mov al, [0x3]
是一个错误,应为mov al,0x03
(但是我将其与上一条指令结合在一起,例如mov ax,(0x53 << 8) | 0x03
)。