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

Success SegDefReg(long ea,char reg,long value)

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

Аргумент ea задает любой линейный адрес, принадлежащий сегменту, в которой необходимо поместить директиву ASSUME.

Аргумент reg задает сегментный регистр в символьном представлении, например, “DS”,”ES”,”SS” и т.д. Строчечные и прописные символы не различаются. Тип процессора при назначении сегментного регистра учитывается.

Аргумент value содержит базовый адрес сегмента, загружаемый в регистр и выраженный в параграфах. Если сегмента с указанным базовым адресом не существует, регистр приобретает неопределенное (“nothing”) значение.

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

Пример использования (см. файл “assume.idb”, содержащийся на диске, прилагаемом к книге): пусть имеется один сегмент кода (“seg00”) и два сегмента данных (“seg001” и “seg002”), содержащих переменные “My666” и “My777” соответственно. По умолчанию значения сегментных регистров неопределенны и IDA не может определить к каким именно сегментам происходит обращения в командах “mov ax,ds:[0]” и “mov dx,es:[0]”, поэтому, вынуждена оставить операнды в виде непосредственных смещений. (в тексте они выделены жирным шрифтом)

seg000:0000 seg000 segment byte public 'CODE'

seg000:0000 assume cs:seg000

seg000:0000 assume es:nothing, ss:nothing, ds:nothing

seg000:0000 mov ax, ds:0

seg000:0003 mov dx, es:0

seg000:0003 seg000 ends

seg000:0003

seg001:0000 ; ═════════════════════════════════════════════════════════════

seg001:0000

seg001:0000 ; Segment type: Pure data

seg001:0000 seg001 segment byte public 'DATA'

seg001:0000 assume cs:seg001

seg001:0000 My666 dw 6666h

seg001:0000 seg001 ends

seg001:0000

seg002:0000 ; ═════════════════════════════════════════════════════════════

seg002:0000

seg002:0000 ; Segment type: Pure data

seg002:0000 seg002 segment byte public 'DATA'

seg002:0000 assume cs:seg002

seg002:0000 My777 dw 7777h

seg002:0000 seg002 ends

Задать значения сегментных регистров можно с помощью функции DefSegReg, вызов которой может выглядеть так:

DefSegReg(SegByName(“seg000”), “DS”, SegByName(“seg001”)>>4);

DefSegReg(SegByName(“seg000”), “ES”, SegByName(“seg002”)>>4);

В результате ее выполнения, IDA смогла отследить обращения к переменным, автоматически подставив их имена вместо смещений (в тексте они выделены жирным шрифтом). Поместив курсор в границы того или другого имени, нажатием клавиши <Enter> можно перейти к соответствующей ячейке памяти.

seg000:0000 seg000 segment byte public 'CODE'

seg000:0000 assume cs:seg000

seg000:0000 assume es:seg002, ss:nothing, ds:seg001

seg000:0000 mov ax, My666

seg000:0003 mov dx, es:My777

seg000:0003 seg000 ends

seg000:0003

seg001:0000 ; ═════════════════════════════════════════════════════════════════

seg001:0000

seg001:0000 ; Segment type: Pure data

seg001:0000 seg001 segment byte public 'DATA'

seg001:0000 assume cs:seg001

seg001:0000 My666 dw 6666h ; DATA XREF: seg000:0000r

seg001:0000 seg001 ends

seg001:0000

seg002:0000 ; ═════════════════════════════════════════════════════════════════

seg002:0000

seg002:0000 ; Segment type: Pure data

seg002:0000 seg002 segment byte public 'DATA'

seg002:0000 assume cs:seg002

seg002:0000 My777 dw 7777h ; DATA XREF: seg000:0003r

seg002:0000 seg002 ends

seg002:0000

??? #верстальщику – change table

аргумент

пояснение

ea

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

reg

сегментный регистр в строковом представлении (например, “DS”)

val

базовый адрес сегмента, загружаемого в регистр, выраженный в параграфах

return

всегда единица

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

Интерактивный аналог: “~Edit\Segments\Change segment register value”, <Alt-G>

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