Как выключить машину? Я строю крошечную ОС самостоятельно
Может ли команда 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 загружается слева направо.