Пишем программу начальной загрузки компьютера
Структура нашей первой программы для загрузочного сектора:
Иницализируем сегментные регистры, запретив на это время все прерывания. Начало стека установим равным адресу загрузки программы 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

Текст всей программы st1.asm находиться здесь
Вариант этой программы st1_mod.asm с другим оформлением экрана можно взять здесь
[Назад] [↑]
Hosted by uCoz