Анимация
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

SegCreate(0x100,0x200,0x10,0,0,0);

a) создаем два сегмента с адресами начала 0x100 и 0x1000.

Message(">%X\n",FirstSeg());

b) вызываем функцию FirstSeg для получения наименьшего линейного адреса сегмента

>100

c) результат - линейный адрес сегмента с наименьшим линейным адресом начала ??? #Верстальщику Change Table

аргумент

пояснения

return

=return

пояснение

!=BADADDR

линейный адрес начала сегмента с наименьшим линейным адресом

==BADADDR

ошибка

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

еньй аес начала сегмеа с науеньп леньм адсом начала

= [] Program Segmentation ==

Name art End Align Base Type Cls 32es ss ds ▼

seg000 00000000 00000100 at 0010 pri N FFFF FFFF FFFF 00000100 00000200

seg001 00000E70 00001F70 at 0009 pri N FFFF FFFF FFFF lil0"j1lil0i ОоОоОоОСГ»;»;,

=3=[,] ▲

long NextSeg(long ea)

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

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

Замечание: NextSeg обычно используется в паре с FirstSeg для получения списка адресов начала всех существующих сегментов.

Конструкция NextSeg(O) аналогичная FirstSeg() при условии, что начальные адреса всех сегментов отличны от нуля (как правило, так практически всегда и бывает).

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

Ниже приводится пример реализации функции PrevSeg, работающей по следующему алгоритму: вызовами NextSeg сегменты перебираются один за другим до тех пор, пока линейный адрес начала очередного сегмента не превысит переданное значение ea. Затем - возвращается линейный адрес



начала предыдущего сегмента.

static PrevSegEx(ea)

auto a; a=0;

while (SegEnd(NextSeg(a))<ea) a=NextSeg(a); return a;

Пример использования NextSeg для получения списка адресов начала всех существующих сегментов:

SegCreate(0x10 0,.0x2 0 0,0x10,0,0,0);

SegCreate(0x1000,0x2000,0x100,0,0,0);

SegCreate(0x10000,.0x20000,0x1000,0,0,0);

a) создаем три сегмента с адресами начала 0x100, 0x1000 и 0x1000

0. Creating a new segment

1. Creating a new segment

2. Creating a new segment b) сегменты успешно созданы

[00000100-00000200) [00001000-00002000) [00010000-00020000)

OK OK OK

auto a; a=FirstSeg(); while(a!=BADADDR) {

Message(">%X\n",a); a=NextSeg(a);

c) вызываем функцию NextSeg в цикле для получения линейных адресов начала всех существующих сегментов.

>100

>1000

>10000

d) результат - линейные адреса начала всех существующих сегментов ??? #Верстальщику Change Table

аргумент

пояснение

линейный адрес не обязательно принадлежащий какому-нибудь сегменту

return

=return

Пояснение

!=BADADDR

линейный адрес начала следующего сегмента

==BADADDR

ошибка

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

линейный

Name seg000 seg001 seg002

адрес начала следующего сегмента--------------------Program Segmentation

Start End Align Base Type Cls 32es ss ds

00000000 00000100 at 0010 pri N FFFF FFFF FFFF 00000100

00000000 00001000 at 0100 pri N FFFF FFFF FFFF 00001000

00000000 00010000 at 1000 pri N FFFF FFFF FFFF 00010000

=£=[t] =1 ▲

00002000 00020000



void SetSelector(long sel,long value)

Функция создает новый селектор или изменяет значение уже существующего селектора. Создаваемый селектор не должен совпадать с базовым адресом ни одного сегмента, иначе для базирования этого сегмента будет автоматически использоваться созданный селектор, а не его базовый адрес, что приведет к искажению всех смещений внутри сегмента.

Максимальное допустимое количество селекторов равно 4096 (0x1000 в шестнадцатеричной системе исчисления), а индексы селекторов могут принимать любые значение от 0x0 до 0xFFFF включительно.

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

SetSelector(0x1,0x666);

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

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

>666

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

SetSelector(0x10001,0x777);

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

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

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

>777

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

0x10001 AND 0xFFFF == 0x1

Аргумент value содержит 32-разрядное значение базы сегмента в параграфах. Оно будет автоматически использовано для базирования сегмента базовый адрес которого равен индексу данного селектора.

Замечание: функция DeleteAll (см. описание функции DeleteAll), удаляющая все сегменты, не уничтожает селекторов и их приходится удалять «вручную» вызовом DelSelector.

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

аргумент

пояснения

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

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

return

=return

пояснение

void

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

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

Интерактивный аналог: "~View\Selector", <Insert> - создает новый, <Ctrl-E>



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