Анимация
JavaScript
|
Главная Библионтека 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
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 |