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

Char SegName(long ea)

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

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

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

SegRename(0x1000,”MySeg”);

a) создаем сегмент и тут же переименовываем его в “MySeg”

MySeg:0000 MySeg segment at 100h private ''

b) сегмент успешно создан (имя выделено жирным шрифтом)

Message(">%s\n",SegName(0x1000));

c) вызываем функцию SegName для получения имени сегмента

>MySeg

d) результат – имя сегмента

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

аргумент

пояснения

ea

линейный адрес, принадлежащий сегменту

return

=return

Пояснение

!=””

имя сегмента

“”

ошибка

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

Интерактивный аналог: по умолчанию имя сегмента отображается в адресе каждой ячейки

Long FirstSeg()

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

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

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

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

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 ═════════════════│═══========════3═[↑]═╗

║ Name Start End Align Base Type Cls 32es ss ds ▼ ▲

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

║ seg001 00000F70 00001F70 at 0009 pri N FFFF FFFF FFFF 00001000 00002000 ▒

║ ▒

╚═══════════════════════════════════════◄■▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒►─┘

Long NextSeg(long ea)

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

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

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

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

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

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

static PrevSegEx(ea)

{

аuto a;

a=0;

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

return a;

}

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

SegCreate(0x100,.0x200,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 (00000100-00000200) ... ... OK

1. Creating a new segment (00001000-00002000) ... ... OK

2. Creating a new segment (00010000-00020000) ... ... OK

b) сегменты успешно созданы

auto a;

a=FirstSeg();

while(a!=BADADDR)

{

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

a=NextSeg(a);

}

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

>100

>1000

>10000

d) результат – линейные адреса начала всех существующих сегментов

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

аргумент

пояснение

ea

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

return

=return

Пояснение

!=BADADDR

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

==BADADDR

ошибка

Родственные функции: FirstSeg

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

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

╔═[■]═══════════════════════════════ Program Segmentation ═══════════════════│═════════5═[↑]═╗

║ Name Start End Align Base Type Cls 32es ss ds │ ▲

║ seg000 00000000 00000100 at 0010 pri N FFFF FFFF FFFF 00000100 │ 00000200 ■

║ seg001 00000000 00001000 at 0100 pri N FFFF FFFF FFFF 00001000 ◄ 00002000 ▒

║ seg002 00000000 00010000 at 1000 pri N FFFF FFFF FFFF 00010000 00020000 ▒

║ ▼

╚═════════════════════════════════════◄■▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒►─┘

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