assembly - 如何完全挂起处理器?

标签 assembly x86

我正在为基于 x86 的 PC 编写一个小型引导加载程序。问题是在执行这些指令后,CPU 以某种方式仍然处于事件状态:

sti
hlt

sti 应该禁用下一条指令的中断
hlt 应该完全停止处理器

由于它们一起使用,我认为它们只会“卡住”计算机。但是当我组装它并将它作为软盘镜像安装在 VirtualBox 中时,我的 CPU 会跳到 100%。

我究竟做错了什么?

最佳答案

我想添加关于 'cli' 的评论,因为我过去曾被它咬过几次。 'cli' 指令不会阻止所有中断——它只会阻止可屏蔽的中断。可以想象,由于不可屏蔽中断 (NMI),系统仍然可以被唤醒。

由于其中一条评论表明计算机已准备好关闭,我希望系统中没有其他线程/进程/任务准备好运行(否则 NMI 可能会导致重新安排)。对于您描述的 NMI 场景不太可能;但是,根据您对出错的偏执程度,您可能希望添加一个循环来防范这种可能性。

sysSuspend:
    cli
    hlt
    jmp sysSuspend

关于assembly - 如何完全挂起处理器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3747847/

相关文章:

arrays - 计算汇编中数组元素的数量

c - 汇编:如何将 float 扩展为 double 以便使用 sin 函数

c - GDB 和 asm 32 字节

assembly - AT&T asm 中的 "outb"是什么意思?

c - _mm_load_ps vs. _mm_load_pd vs. Intel x86 ISA 等

x86 - 为什么 0xE1 0x4F 在 LLVM 和 NDISASM 中反汇编为不同的指令?

c - 使用 cmpxchg8b 未获得 unsigned long 的预期输出

c - 将变量移动到 cl 并使用内联汇编执行 shr

pointers - Nasm - 按值和地址访问结构元素

assembly - 为什么在push指令时使用SIGSEGV