Иницализируем сегментные регистры, запретив на это время все прерывания. Начало стека установим равным адресу загрузки программы 0:7C00 (чтобы не придумывать новое значение :-). Это допустимо, так как стек заполняется в сторону меньших адресов и код самой программы при заполнении стека не затрется. |
cli ; запретить прерывания xor ax,ax ; обнуляем ax mov ss,ax ; ax -> ss mov ax,LoadAddr ; 7C00h -> ax mov sp,ax ; ax -> sp |
В регистр ds также поместим адрес загрузки программы, но деленный на 16, то есть измеренный в параграфах. Для используемого адреса загрузки 7C00 это допустимо, так как этот адрес на границе параграфа. Так как регистры инициализированы, то прерывания разрешаем. |
shr ax,4 mov ds,ax sti ; разрешить прерывания |
Еще раз вспомним, что мы работаем без операционной системы,
поэтому для работы с аппаратурой можем использовать только средства BIOS
либо работать на уровне регистров устройств.
Выводить сообщения на экран будем с помощью программного прерывания 10h.
Для удобства оформим в виде подпрограммы, которая нам пригодится и дальше. |
putscr: mov ah,0Eh ; функция 0Eh - вывести символ в режиме TTY @@: lodsb ; загрузить символ в AL из ds:si or al,al ; нулевой байт ? jz @f ; да, переход к окончанию int 10h ; BIOS Видеосервис Int 10h jmp @b ; безусловный переход @@: ret ; возврат из продпрограммы |
При вызове процедуры адрес начала сообщения предварительно помещается в регистры ds:si , а само сообщение должно заканчивться нулевым байтом. |
; Выводим первое сообщение на экран mov si,tMsgHello ; адрес сообщения Hello call putscr ; вызываем подпрограмму ; вывода на экран |
Вся запланированная работа выполнена. Теперь выводим уведомление и останавливаем процессор. Перезагрузка возможна только кнопкой "Reset" |
mov si,tMsgHalt ; адрес сообщения Halt call putscr ; выводим сообщение cli hlt ; СТОП |
Кроме программы загрузочный сектор должен иметь в самом конце абревиатуру 0AA55h (магическое число) Неиспользуемое пространство целесообразно заполнить нулями. |
Empty: times (200h-($-Begin)-2) db 0 Magic dw 0AA55h |