Как выключить машину? Я строю крошечную ОС самостоятельно

Может ли команда hlt в сборе отключить компьютер, когда он останавливает процессор? если это можно сделать, используя то, что я сказал, правильно ли это?

Может ли hlt завершить работу машины?

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

Если этого не сделать, если это не остановит систему, пожалуйста, сообщите мне правильный способ сделать это.

Ответ 1

Инструкция hlt останавливает x86 до тех пор, пока не произойдет прерывание. Если все прерывания не отключены, это остановит процессор всего на миллисекунду или около того.

Чтобы отключить современный компьютер, используйте ACPI (расширенный интерфейс конфигурации и питания).

Ответ 2

инструкция halt не отключает питание. он переводит процессор в неиспользуемое состояние.
обычно вы можете выйти из состояния остановки на процессоре reset.
в некоторых микроконтроллерах определенные прерывания также могут вывести процессор из состояния остановки. выключение питания - это специальная операция с материнской платой/биосом.

Ответ 3

Используя эти две строки кода:

    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

Примечание. Удаление этих двух строк, упомянутых выше, заставляет виртуальную машину использовать максимальные доступные циклы процессора.

Изменить: добавлена ​​инструкция "cld". Как уже упоминалось Майклом, необходимо было убедиться, что text_string загружается слева направо.