2012-05-21 18 views
4

Я нашел 512 байт os конкурс во время веб-серфинга.cli перед запуском в загрузчик

все установлено в сапоге.

после чтения некоторых из этих исходных файлов,

Я нашел там всегда cli инструкции перед запуском рутины. (в сборе)

use16 
org 7c00h 
jmp 0:start 
start: 
    cli 
    do something here..(this section sometimes include int 10h) 

вещь Интересно, это

  1. почему cli необходимо перед запуском подпрограммы.

  2. после cli, иногда они используют прерывание! например int 10h Интересно, почему они используют прерывание после cli было бы нормально?

+0

Можете ли вы показать нам, что «сделайте что-нибудь здесь»? –

ответ

6

1) Единственный случай, когда cli является необходимо до (или в) инициализации загрузочного сектора является, если загрузочный сектор может работать на 8086. Для более поздних процессоров погрузочных ss причинах прерывания должны быть отключены (отложено) до следующей инструкции, которая достаточно длинна, чтобы загрузить sp и получить действительный ss:sp для использования потенциального обработчика IRQ.

2) Программные прерывания (например, int 0x10) не являются прерываниями и не отключены cli. Нормально делать sti вскоре после cli, чтобы избежать беспорядков IRQ. Когда вы пытаетесь сжать что-то в 512 байт, это нормально, чтобы делать глупые вещи, которые ни один здравомыслящий программист не рассматривал бы (например, оставляя прерывания отключенными) просто для того, чтобы сжать лишний байт кода.

4

cli необходимо, только если мы в настоящий момент не требуется обслуживание аппаратных прерываний.

Трудно сказать, почему он используется в коде вы имеете в виду, не видя реального кода, но в целом может быть несколько причин:

  • , чтобы избежать условий гонки с обслуживания прерывания (при доступе общие изменяемые данные)
  • изменить вектор прерывания таблицу атомарно (очень похож на выше)
  • изменить SS:SP атомарно (очень похож на выше)
  • , чтобы избежать исключений, вызванных ЗРМС при переключении Режимы процессора (реальный < -> защита)
  • для измерения времени более точно избегая ISR вклад
  • и т.д.

В основном, когда аппаратные ЗРМСЫ могут мешать основной код в некоторых нежелательных способах, вы отключить прерывания.

О, и int 10h не имеет ничего общего с запросами прерывания, поступающими с аппаратного обеспечения. Просто некоторые ISR используются для обработки аппаратных прерываний (от, например,клавиатура или сеть), а другие используются в качестве вспомогательных подпрограмм или системных вызовов с удобным интерфейсом (вам не нужно знать точное местоположение ISR, число векторов (10 часов)). Функции BIOS int 10h позволяют изменять режимы отображения и писать текст на экране.

Смежные вопросы