如何使用BIOS INT 0x15, AX=0x5307(关机)?
How to use BIOS INT 0x15, AX=0x5307 (shut down computer)?
有中断什么是关机:
shutdown:
mov ax, 0x1000
mov ax, ss
mov sp, 0xf000
mov ax, 0x5307
mov bx, 0x0001
mov cx, 0x0003
int 0x15
ret ;if interrupt doesnt work
为什么要对寄存器 A 和选择器 SS 进行操作?
我尝试删除前三行,但它仍然有效。
首先,mov ax, ss
似乎是一个错字,可能应该是 mov ss, ax
。然后这三个指令将堆栈指针设置为1000:f000
.
在调用软件中断之前,您需要设置一个堆栈,ss:sp
指向可以安全写入的内存。否则,return 地址和标志被推送到哪里?并且中断处理程序本身可能期望有一定数量的堆栈space可用(我不知道BIOS是否保证切换堆栈)。
这大概就是这些台词的目的。也许 shutdown
子例程是从某个不一定具有有效堆栈的地方跳转到的,或者程序员只是不愿意依赖调用者的堆栈是有效的。如果代码在您的测试中没有这些行就可以工作,大概是因为您使用已经有效的堆栈调用它。
有中断什么是关机:
shutdown:
mov ax, 0x1000
mov ax, ss
mov sp, 0xf000
mov ax, 0x5307
mov bx, 0x0001
mov cx, 0x0003
int 0x15
ret ;if interrupt doesnt work
为什么要对寄存器 A 和选择器 SS 进行操作? 我尝试删除前三行,但它仍然有效。
首先,mov ax, ss
似乎是一个错字,可能应该是 mov ss, ax
。然后这三个指令将堆栈指针设置为1000:f000
.
在调用软件中断之前,您需要设置一个堆栈,ss:sp
指向可以安全写入的内存。否则,return 地址和标志被推送到哪里?并且中断处理程序本身可能期望有一定数量的堆栈space可用(我不知道BIOS是否保证切换堆栈)。
这大概就是这些台词的目的。也许 shutdown
子例程是从某个不一定具有有效堆栈的地方跳转到的,或者程序员只是不愿意依赖调用者的堆栈是有效的。如果代码在您的测试中没有这些行就可以工作,大概是因为您使用已经有效的堆栈调用它。