Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ida.final.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
6 Mб
Скачать

Long AskSelector(long sel)

Функция возвращает значение селектора в параграфах. Если запрошенный селектор отсутствует, функция возвратит переданное ей значение, сигнализируя об ошибке (внимание! не BADADDR). Поскольку, значение селектора не может быть равно его индексу, никакой неоднозначности не возникает, однако, автору книги совершенно непонятно чем вызвано такое решение – не лучше ли при неуспешном завершении функции возвращать BADADDR – значение, которое не может иметь ни один селектор?

Аргумент sel задает 16-разрядный индекс запрашиваемого селектора. Старшее слово передаваемого 32-битного значения автоматически обрезается, в результате существует возможность обращения совсем к другому селектору, чем предполагалось.

Ввиду всего вышесказанного проверка успешности завершения функции должна выглядеть так:

if ((selvalue=AskSelector(sel)) == (sel & 0xFFFF))

// ошибка

else

// успешное завершение функции

??? #Верстальщику Change Table

аргумент

пояснения

sel

16-разрядный индекс запрашиваемого селектора

return

=return

пояснения

sel & 0xFFFF

ошибка

!=(sel & 0xFFF)

32-разрядное значение селектора в параграфах

Родственные функции: SetSelector, FindSelector

Интерактивный аналог: “~View\Selectors”

┌─── Индекс селектора

│ ┌─── значение селектора

╔═▼[■]══▼══ Selectors ══4═[↑]═╗

║ Sel Value ▲

║ 0001 00000666 ■

║ 0002 00000999 ▒

║ ▼

╚1/2 ═══════════════─┘

Long FindSelector(long val)

Функция возвращнаходит индекс селектора с указанным значением val, выраженном в параграфах.

Если существуют два и более селектора с идентиченым значениями, функция возвращает индекс первого из них в порядке создания. Если же ни одного селектора с таким значением не существет, функция возращает младшие 16 бит переданного ей агрумента обратно.

Поскольку, значение селектора не может быть равно его индексу, никакой неоднозначности не возникает, однако, автору книги совершенно непонятно чем вызвано такое решение – не лучше ли при неуспешном завершении функции возвращать BADADDR – значение, которое не может иметь ни один селектор?

Ввиду всего вышесказанного проверка успешности завершения функции должна выглядеть так:

if ((sel=FindSelector(selvalue)) == (selvalue & 0xFFFF))

// ошибка

else

// успешное завершение функции

Замечание: поскольку с данным базовым адресом может существовать только один сегмент, в создании двух и более селекторов с одинаковыми значениями никакой необходимости нет. Тем не менее, функция SetSelector не препятствует этому и существования двух и более селекторов с одинаковыми индексами в принципе возможно, – один селектор может использоваться для базирования некоторого сегмента, а остальные простаивать. В такой ситуации функция FindSelector может возвратить неверный результат, поэтому, перед ее вызовом следует убедиться, что существует не более одного селектора с каждым значением. Единственный документированный способ решения этой задачи заключается в последовательном переборе всех возможных селекторов в интервале от 0x0 до 0xFFFF.

??? #Верстальщику Change Table

аргумент

пояснения

val

32-разрядное значение селектора в параграфах для поиска

return

=return

пояснение

==(val & 0xFFFF)

ошибка

!=(val & 0xFFF)

16-разрядный индекс селектора с указанным значением

Родственные функции: SetSelector, AskSelector

Интерактивный аналог: “~View\Selectors”

┌─── Индекс селектора

│ ┌─── значение селектора

╔═▼[■]══▼══ Selectors ══4═[↑]═╗

║ Sel Value ▲

║ 0001 00000666 ■

║ 0002 00000999 ▒

║ ▼

╚1/2 ═══════════════─┘

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]