Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [ 26 ] 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140

изменяет значение уже существующего селектора.

void DelSelector(long sel)

Функция удаляет селектор, если он существует, в противном случае ничего не происходит. Если данный селектор использовался для базирования сегмента, новый базовый адрес сегмента будет равен base = sel * 0x10, а смещение первого байта в сегмента соответственно: startoffset = startea - sel * 0x10. Создав заново уничиженный селектор вызовом SetSelector, можно все вернуть на свои места.

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

SetSelector(0x1,0x666); Message(">%X\n",AskSelector(0x1));

a) создаем селектор с индексом 0x1 и значением 0x666 и тут же проверяем его значение

>666

b) селектор имеет значение 0x666

DelSelector(0x10001,0x777);

c) пытаемся удалить селектор с индексом 0x10001

Message(">%X\n",AskSelector(0x1));

d) проверяем значение селектора 0x1

>FFFFFFFF

e) результат - селектора 0x1 был уничтожен! Старшие 16 бит индекса 0x10001 были обрезаны, в результате чего был удален селектор 0x10001 AND 0xFFFF == 0x1

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

аргумент

пояснения

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

return

=return

пояснение

void

функция не возвращает никакого значения

Родственные функции: SetSelector Интерактивный аналог: "~View\Selectors", <Del>

long AskSelector(long sel)

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

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



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

if ((selvalue=AskSelector(sel)) == (sel & OxFFFF))

ошибка

else

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

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

аргумент

пояснения

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

return

=return

пояснения

sel & 0xFFFF

ошибка

!=(sel & 0xFFF)

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

Родственные функции: SetSelector, FindSelector Интерактивный аналог: "~View\Selectors"

- Индекс селектора

I- значение селектора

▼[] =▼= Selectors =4=[t] =п Sel Value ▲

0001 00000666

0002 00000999

long FindSelector(long val)

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

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

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

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

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

ошибка

else

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

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



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

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

аргумент

пояснения

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

return

=return

пояснение

==(val & 0xFFFF)

ошибка

!=(val & 0xFFF)

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

Родственные функции: SetSelector, AskSelector Интерактивный аналог: "~View\Selectors"

Индекс селектора I- значение селектора

Selectors

Value

0001 00000666

0002 00000999

=4=[т] ▲

ЭЛЕМЕМЕНЫ

#Defenition

С каждым адресом виртуальной памяти связано 32-разрядное поле флагов (см. главу «Виртуальная память»). Флаги хранят содержимое ячейки, описывают ее представление и указывают на наличие связанных с ней объектов.

Содержимое ячейки: флаги хранят содержимое ячейки виртуальной памяти (в восьми младших битах) или указывают на то, что ячейка содержит неинициализированное значение (см. главу «Виртуальная память»).

Представление: флаги определяют будет ли отображаться данный байт в виде данных или машинной инструкции. Они так же позволяют уточнить в виде каких именно данных (массива, строки, переменной, непосредственного значения или смещения) он должен отображаться (см. главу «Типы элементов»)

Связанные объект: флаги указывают на наличие на наличие связанных с ячейкой объектов - меток, имен, комментариев и т.д. Сами объекты хранятся в отдельном виртуальном массиве, проиндексированного линейными адресами. В принципе без флагов, ссылающихся на объекты можно было бы и обойтись, но тогда бы пришлось при отображении каждой ячейки просматривать все виртуальные массивы на предмет поиска объектов, ассоциированных с данным линейными адресом, что отрицательно сказалось бы на производительности дизассемблера. Напротив, перенос этой информации в флаги позволяет ускорить работу - обращение к виртуальному массиву происходит только в тех случаях, когда с ячейкой заведомо связан какой-то объект. (см. главу «Объекты»)

Размер машинных инструкций и типов данных различен, и это не дает возможности быстро определить к какой инструкции (переменной) принадлежит ячейка с таким-то линейным адресом. Можно провести следующую аналогию - текст со словами не



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [ 26 ] 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140