【问题标题】:How to use BIOS INT 0x15, AX=0x5307 (shut down computer)?如何使用 BIOS INT 0x15, AX=0x5307(关闭计算机)?
【发布时间】:2021-08-06 01:12:25
【问题描述】:

有中断什么是关机:

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 ss, ax,这将更有意义。
  • 你必须有一个有效的堆栈才能执行软件中断,因为返回地址和标志被推到那里(即使在这种情况下它不会被使用)。所以我们需要让ss:sp 指向一些有效的内存区域。如果没有这个就可以工作,那么很可能幸运的是,他们已经指向了碰巧可写的地方。我同意@ThomasJager 的观点,即mov ax, ss 可能是mov ss, ax 的拼写错误。
  • @NateEldredge 为什么不把它写成“答案”?

标签: assembly x86-16 callstack bios


【解决方案1】:

首先,mov ax, ss 似乎是一个错字,应该是mov ss, ax。然后这三个指令将堆栈指针设置为1000:f000

在调用软件中断之前,您需要设置一个堆栈,ss:sp 指向可以安全写入的内存。否则,返回地址和标志会被推送到哪里?并且中断处理程序本身可能期望有一定数量的可用堆栈空间(我不知道 BIOS 是否保证切换堆栈)。

所以这大概就是这些行的目的。也许shutdown 子例程是从某个不一定有有效堆栈的地方跳转到的,或者程序员只是不愿意依赖调用者的堆栈是有效的。如果代码在您的测试中没有这些行就可以工作,大概是因为您使用已经有效的堆栈调用它。

【讨论】:

    猜你喜欢
    • 2020-05-17
    • 2016-03-06
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 2012-08-31
    • 2019-11-23
    相关资源
    最近更新 更多