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

Long SetMemberComment(long id,long member_offset,char comment,long repeatable);

Функция устанавливает комментарий, связанный с членом структуры. IDA поддерживает два типа комментариев – ‘regular’ и ‘repeatable’. Последний отличается тем, что дублируется по месту обращения к элементу обращения структуры. Однако в случае со структурами и их членами, IDA игнорирует это требование, в чем убеждает следующий пример:

0000 MyStruc struc ; (sizeof=0x4) ; XREF: seg000:0F72r

0000 field_0 dw ? ; My Repeatable comment

0002 field_1 dw ? ;

0004 MyStruc ends

seg000:0F72*stru_0_F72 dw 0 ; field_0 ; DATA XREF: sub_0_F56r

seg000:0F72* ; sub_0_2456+1Cw ...

seg000:0F72* dw 0 ; field_1

seg000:0F56 mov es, stru_0_F72.field_0

seg000:0F5A assume es:nothing

seg000:0F5A xor bx, bx

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

Операнд

Пояснения

id

Идентификатор (ID) структуры

comment

Комментарий члена

member_offset

Смещение, лежащее в границах интересующего нас элемента

Repeatable

Флаг

Пояснения

0

Неповторяемый комментарий

1

Повторяемый комментарий

Return

==return

Пояснения

==1

Успешное завершение

==0

Ошибка (см коды завершения выше)

Перечисления alma mater

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

Прежде всего, – что же такое перечисления? Грубо говоря, – это константы, то есть предопределенные символьные значения, которые в ходе ассемблирования заменяются действительными значениями.

Использования непосредственных значений – дурной тон программирования. Как, например, на счет следующего кода:

PUSH 10

PUSH 02

CALL GotoXY

PUSH offset ProgramName

CALL WriteLn

Как нетрудно догадаться, числа 10 и 2 представляют собой экранные координаты, в которых будет выведено имя программы. Впрочем, если вы не автор этого фрагмента кода, то догадаться может быть вовсе не так просто, да и кроме того, что делать если придется переписывать программу для работы с другим экранным разрешением?

Просматривать весь код на предмет поиска всех, относящихся к экранным координатам констант?

Вот для этого в ассемблерах и появилась директива EQU, которая позволяла определить «говорящие» константы, которые не только повышали информативность листинга и заменяли комментарии. Но позволяла легко модифицировать их, – ведь теперь непосредственное значение указывалось только в одной точке.

Разумеется, IDA поддерживает константы. Но делает не так, как это можно ожидать. Если все ассемблеры поддерживают исключительно глобальные списки констант, что часто вызывает путаницу, то IDA умеет «разбивать» их на отдельные кучки – каждая под своей «крышей»

Внешне список констант напоминает структуру. Взгляните, в самом деле это очень похоже:

; enum enum_1

enum_1_0 = 3

enum_1_4 = 5

; ------------------------

; enum enum_3

enum_3_14E = 1

enum_3_0 = 2Ch

enum_3_2D = 14Dh

Однако, в отличие от структуры элементы перечисления не имеют ни типа, ни размера. Точнее тип определяется только на стадии ассемблирования.

Так, например, если enum_1_0 равен трем, это еще не означает, что он имеет тип байт. Вполне вероятно, что он окажется словом или даже и словом и байтом одновременно, например:

MOV AL, enum_1_0

CMP AX, enum_1_0

Этот код, не смотря на всю его чудаковатость, все же будет успешно ассемблирован!

Но если нет типов, и не возможно вычислить размер членов, то как же тогда осуществить к ним доступ?

Теоретически было можно условиться, что каждый член занимает 32 байта (двойное слово) и организовать к ним доступ точно так, как и в структурах. И это бы неплохо работало!

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

В свете этого становиться еще более непонятым, какой смысл имеет «группировка» перечислений. Имена членов – глобальные, идентификаторы – тем более. Что же дает принадлежность элемента к той или иной группе?

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

Однако, на самом деле это следствия выбранной архитектуры. И весьма удачной, стоит только взглянуть на нее изнутри, чем мы сейчас и займемся.

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