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

Selector 0x1

Value 0x10000

Значение селектора может совпадать с базовым адресом любого из существующих сегментов, на него не действует ограничение startea > BASE ADDRES * 0x10, но если присвоить селектору значение численно равное его индексу, он будет немедленно удален.

Присвоение селектору базового адреса, превышающего адрес начала сегмента, приводит к появлению байт с отрицательными смещениями, которые автоматически дополняются до нуля, т.е. offset = NEG (jstartea - SEL VALUE) .

Например, после увеличения значения селектора 0x1 на один параграф экран дизассемблера будет выглядеть так:

s002: s002: s002: s002:

seg002: seg002: seg002: seg002: seg002: seg002: seg002: seg002: seg002: seg002: seg002: seg002: seg002: seg002: seg002: seg002: seg002: seg002: seg002: seg002: seg002: seg002: seg002:

EFFFFFE0 seg002

FFFFFFF0

FFFFFFF0

FFFFFFF0

FFFFFFF0

FFFFFFF1

FFFFFFF2 FFFFFFF3 FFFFFFF4

FFFFFFF5 FFFFFFFe FFFFFFF7

FFFFFFF8

FFFFFFF9

FFFFFFFA

FFFFFFFB

FFFFFFFC

FFFFFFFD

FFFFFFFE

FFFFFFFF

0000

0001

0002

0003

0004 0005 0006

0007

segment at 10001h riate use16 assume cs:seg002

assu

db db

db db db db db

0FFFFFFF0h me es:nothing,

unexplored unexplored unexplored unexplored unexplored unexplored unexplored unexplored unexplored unexplored unexplored unexplored unexplored unexplored unexplored unexplored nexplored nexplored nexplored unexplored unexplored unexplored unexplored unexplored

ss:nothing, ds:nothing, fs:nothing, gs:nothing

Исправить ситуацию можно соответствующим увеличением адреса начала сегмента. После вызова «SegBounds(0x100000,0x100010,0x100100,1);» экран дизассемблера должен выглядеть так:

Name seg000 seg001 seg002 3/3

Start

= Program Segmentation Align Base Type Cls 32es s

000012 byte 1000 pub CODE

00013C byte 2000 pub

0000F0 at 0001 pub

32es ss ds fs gs N FFFF FFFF FFFF FFFF FFFF 00010000 00010012

l=[t] T ▲

N FFFF FFFF FFF FFFF FFFF 00020100 0002013C N FFFF FFFF FFFF FFF FFFF lil1l0il1li 0010101001

Смещение первого байта в сегменте "seg002" равно нулю, чего и требовалось достичь.

Программно создать новый селектор или изменить значение уже существующего селектора можно с помощью функции "void SetSelector (long sel,long value)", где sel -индекс селектора, а value - его значение, измеряемое в параграфах.



Например, вызов "SetSelector(0x1,0x10000);" изменит значение селектора 0x1 и смещение первого байта в сегменте "seg002" будет равно нулю, а вызов "SetSelector(0x4,0x500000);" создаст новый селектор с индексом 0x4 (индексы селекторов не обязательно должны следовать друг за другом).

- Program Segmentation-4-

Name Start End Align Base Type Cls 32es ss ds fs gs

seg000 00000000 00000012 byte 1000 pub CODE N FFFF FFFF FFFF FFFF FFFF 00010000 00010012

seg001 00000100 0000013C byte 2000 pub N FFFF FFFF FFFF FFFF FFFF 00020100 0002013C

seg002 00000010 00000100 at 0001 pri N FFFF FFFF FFFF FFFF FFFF 00100010 00100100

3/3 -

Sel Value 0001 00010000 0004 00500000

: Selectors 5=[t] =]

Удалить селектор можно вызовом функции "void DelSelector (long sel)" либо присвоением ему собственного индекса - SetSelector (sel, sel).

Если удалить используемый селектор, то смещение первого байта в сегменте, который на него ссылался станет равным: offset = startea - sel * 0x10 , где sel - индекс (не значение!) селектора.

Например, после вызова "SelDelete(0x1);" экран дизассемблера будет выглядеть

так:

Program Segmentation

Name Start End Align Base Type Cls 32es ss ds fs gs

seg000 00000000 00000012 bye 1000 pub CODE N FFFF FFFF FFFF FFFF FFFF 00010000 00010012 si;

seg001 00000100 0000013C byte 2000 pub N FFFF FFFF FFFF FFFF FFFF 00020100 0002013C

seg002 00100000 001000F0 at 010101 pri N FFFF FFFF FEFF EFF FFFF 0i0100i010i 0010i0100i ▼ 3/3 ►-

Рисунок 21

Операция удаления обратима и повторное создание уничтоженного селектора все вернет на свои места.

Функция long FirstSeg() возвращает линейный адрес начальный сегмента, имеющего наименьший адрес начала, соответственно функция long NextSeg(long ea) возвращает линейны адрес сегмента, следующего за ea.

Пример использования:

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

Message(">%0 8x\n",a,SegName(a));

a=NextSeg(a);

>00010000 >00020100 >00100010

Зная адрес начала сегмента можно получить его имя вызовом функции SegName, а зная имя сегмента можно получить его базовый адрес при помощи функции SegByName; более быстрого способа вычисления базового адреса по-видимому не существует.



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

Скрипт, приведенный ниже, распечатывает список всех существующих сегментов, с указанием их основных характеристик.

auto a; a=FirstSeg();

Message(">Name Start End BASE\n");

Message(">-----------------------------\n");

while(a!=BADADDR)

Message(">%s%08x%08x%08x\n",

SegName(a),a,SegEnd(a),SegByName(SegName(a))/0x10); a=NextSeg(a);

Message(">-----------------------------\n\n");

>Name Start End BASE

>---------------------------------

>seg000000100000001001200001000 >seg001000201000002013c00002000 >seg002001000100010010000010000

>---------------------------------Узнать обо всех остальных атрибутах сегмента можно при помощи функции GetSegmentAttr.

Сводная таблица функций

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

функции преобразования адресов

имя функции

краткое описание

long MK FP (long seg, long off)

преобразует сегментный адрес в линейный

char atoa (long ea)

преобразует линейный адрес в строковой сегментный

функции, работающие с сегментами

функции создания и удаления сегментов

имя функции

краткое описание

success SegCreate(long startea,long endea,long base,long use32,long align,long comb)

создает новый сегмент или изменяет атрибуты уже существующего сегмента

success SegDelete (long ea,long disable)

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

функции изменения основных характеристик сегмента

имя функции

краткое описание

success SegBounds (long ea,long startea,long endea,long disable)

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

функции получения основных характеристик сегмента

имя функции

краткое описание

long SegStart (long ea)

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

long SegEnd (long ea)

возвращает линейный адрес конца сегмента

long SegByName (char segname)

по имени сегмента определяет его базовый адрес

long SegByBase(long base)

по базовому адресу сегмента определяет линейный адрес его начала

Функции изменения атрибутов сегмента

имя функции

краткое описание



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