Assembly 如何关闭机器?I';我正在构建一个自己的小操作系统

Assembly 如何关闭机器?I';我正在构建一个自己的小操作系统,assembly,operating-system,x86,shutdown,system-shutdown,Assembly,Operating System,X86,Shutdown,System Shutdown,汇编中的hlt指令能否在停止处理器时关闭计算机?如果可以用我所说的去做,这是正确的方法吗 hlt能关闭机器吗 start: xor ax, ax; ;clear ax mov bx, ax; ;clear bx cli ;stop all interrupts hlt ;halt the cpu 如果不是这样做的话,如果这样做不会关闭系统,请告诉我正确的方法。停止指令不会关闭电源。 它将处理器置于非执行状态。 通常,当处理器复位时,您可以退出暂停状态。 在一些微

汇编中的hlt指令能否在停止处理器时关闭计算机?如果可以用我所说的去做,这是正确的方法吗

hlt能关闭机器吗

start:
    xor ax, ax; ;clear ax
    mov bx, ax; ;clear bx
    cli ;stop all interrupts
    hlt ;halt the cpu

如果不是这样做的话,如果这样做不会关闭系统,请告诉我正确的方法。

停止指令不会关闭电源。 它将处理器置于非执行状态。
通常,当处理器复位时,您可以退出暂停状态。
在一些微控制器中,特定的中断也可以使处理器脱离暂停状态。
关闭电源是主板/bios特定的操作。

hlt指令停止x86,直到发生中断。除非所有中断都被禁用,否则处理器只会停止一毫秒左右


要关闭现代计算机的电源,请使用以下两行代码使用。

    cli                     ; stop all interrupts
    hlt                     ; halt the cpu
您可以停止x86 pc的可引导程序:

    BITS 16

start:
    mov ax, 07C0h           ; Set up 4K stack space after this bootloader
    add ax, 288             ; (4096 + 512) / 16 bytes per paragraph
    mov ss, ax
    mov sp, 4096

    mov ax, 07C0h           ; Set data segment to where we're loaded
    mov ds, ax


    cld                     ; clear direction flag
    mov si, text_string     ; Put string position into SI
    call print_string       ; Call our string-printing routine


    cli                     ; stop all interrupts
    hlt                     ; halt the cpu

    jmp $                   ; Jump here - infinite loop!


    text_string db 'Hello World!', 0


print_string:               ; Routine: output string in SI to screen
    mov ah, 0Eh             ; int 10h 'print char' function

.repeat:
    lodsb                   ; Get character from string
    cmp al, 0
        je .done            ; If char is zero, end of string
    int 10h                 ; Otherwise, print it
    jmp .repeat

.done:
    ret


    times 510-($-$$) db 0   ; Pad remainder of boot sector with 0s
    dw 0xAA55               ; The standard PC boot signature
将其保存为“prog.asm”,然后使用“nasm”创建引导扇区:

nasm -f bin -o boot.img prog.asm
现在您可以使用“qemu”来测试它:

qemu-system-i386 -drive file=boot.img,index=0,media=disk,format=raw -boot c -net none
注意:删除上面提到的两行会导致虚拟机使用最大可用cpu周期


编辑:添加了“cld”指令。正如Michael提到的,必须确保从左到右加载文本字符串。

哪个平台?请标记您的问题…为什么最近发布代码的图片变得如此流行?这比复制和粘贴更容易吗?当然你知道如何复制和粘贴…那么请告诉我怎么称呼它。我只想知道如何关闭我的操作系统和computer@alvin:在x86上,每个中断都会使处理器脱离hlt状态。在处理器处于hlt状态时启动计算机并不比在运行时更安全,因为所有磁盘缓冲区等都没有刷新。@drhirsch,你说得对,没有想到操作系统的状态。编辑我的答案。谢谢。但我找不到如何设置全球大国。在这方面我能得到一些帮助吗?对于一个“微型操作系统”,实现ACPI接口不是一件容易的事情。如果您有一台稍旧的计算机,BIOS仍然实现APM,那么您可以通过APM()关闭,这就是Windows95的方式。请注意,以前的操作系统(如DOS)无法关闭计算机。如果NMI到达,无限循环肯定应该包括
cli/hlt
。我的意思是,如果你有一个无限循环的话。。。但无论如何,这并不能回答问题。这只是将CPU保持在低功耗的空闲状态,而不是关闭状态。这不会关闭计算机,它只会停止它。在Ross和Peter提到的非常有效和相关的(关于停止/关闭的问题)之上,我将指出(在一般引导加载程序的上下文中)您的代码错误地假设BIOS在到达引导加载程序之前清除了方向标志。您确实应该调用
CLD
,因为您最终使用了
lodsb