如何使用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 子例程是从某个不一定具有有效堆栈的地方跳转到的,或者程序员只是不愿意依赖调用者的堆栈是有效的。如果代码在您的测试中没有这些行就可以工作,大概是因为您使用已经有效的堆栈调用它。