如何关机?我正在构建一个自己的小操作系统

时间:2012-01-15 03:37:26

标签: assembly operating-system x86 shutdown system-shutdown

程序集中的hlt指令可以在停止处理器时关闭计算机吗?如果可以用我所说的来完成,这是正确的方法吗?

可以关机吗?

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

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

3 个答案:

答案 0 :(得分:10)

hlt指令停止x86直到发生中断。除非禁用所有中断,否则将使处理器停止大约一毫秒左右。

要关闭现代计算机,请使用ACPI (Advanced Configuration and Power Interface)

答案 1 :(得分:1)

暂停指令不会关闭电源。 它使处理器进入非执行状态 通常,您可以在处理器重置时退出暂停状态 在某些微控制器中,特定中断也可使处理器退出暂停状态。 断电是主板/ BIOS专用操作。

答案 2 :(得分:0)

使用这两行代码:

    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"指令。正如迈克尔所提到的,有必要确保从左到右加载text_string。