如何仅使用汇编代码关闭计算机?
您需要说明它是什么处理器系列以及您正在使用的操作系统.还有你的代码运行的特权 - 如果它是内核代码,那么它拥有比用户代码更多的特权.
假设您在Intel x86系列CPU上使用Windows NT系列的某些成员(包括XP或Vista),并且您的代码是正常(用户空间)代码,那么......您需要调用Windows内置函数做这个.你不能只执行一些神奇的装配序列.
即使您可以执行一些神奇的汇编序列,您也不会想要 - 您几乎肯定希望让操作系统有机会将数据从磁盘缓存写入磁盘,并执行其他优雅关闭的操作.
如果您正在为x86编写自己的操作系统,那么您需要查看ACPI(或APM)规范.如果GPL代码没问题,那么相关的Linux内核例程就在这里(ACPI)和这里(APM).
这是我用来在DOS模式下关闭电脑多年的29字节程序.
;Connect to APM API MOV AX,5301 XOR BX,BX INT 15 ;Try to set APM version (to 1.2) MOV AX,530E XOR BX,BX MOV CX,0102 INT 15 ;Turn off the system MOV AX,5307 MOV BX,0001 MOV CX,0003 INT 15 ;Exit (for good measure and in case of failure) RET
您可以在DJGPP使用Ralf Brown的中断列表查找更多功能.
在Linux中读取reboot(2).
来源文件:
kernel/sys.c kernel/exit.c和arch/x86/kernel/apm.c
不是一个完整的答案,但我认为这是一个良好的开端.我将不得不阅读我的BIOS机器代码,看看他们做了什么.但这部分是机器特定的.如果您知道主板上的IC控制电源,您可以找出所需的IO端口,寄存器和命令.然后设置正确的板/设备状态,然后发出命令关闭电源.
BIOS通过INT 15h ah = 53h管理电源(所谓的高级电源管理又称APM)函数al = 07在Linux中使用的是设置电源状态cmd.参数bx = 0001h表示所有设备,cx = 0003k表示停止.