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

Success OpOffEx(long ea,int n,long reftype,long target,long base,long tdelta)

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

Данная функция является усовершенствованным вариантом функции OpOff и поддерживает не только смещения, разрядность которых равна разрядности соответствующего сегмента, но смещения записанные в восьми или шестнадцати младших (старших) битах шестнадцати и тридцати двух разрядных операндов соответственно (см. таблицу ???). При этом остальные биты операнда маскируются операцией «логического и» AND.

Аргумент ea задает линейный адрес элемента, которому принадлежит операнд.

Аргумент n задает операнд, отображаемый в виде смещения (см. таблицу ???)

Аргумент reftype задает тип смещения и может принимать одно из значений, перечисленных в таблице ???

Аргумент target задает линейный адрес целевого смещения выраженный в байтах, относительного которого будет отсчитыватся смещение операнда. Если в качестве целевого смещения передать значение BADADDR, целевое смещение будет вычислено автоматически по следующей формуле:

Аргрумент base задает базовый адрес сегмента, выраженный в байтах, относительно которого задается целевое смещение.

Аргумент tdelta задает относительное смещение, отсчитываемое относительно целевого смещения.Относительное смещение может быть как положительным, так и отрицательным. Если оно равно нулю, то данная функция становится эквивалентна функции OpOff (см. описание функции OpOff).

Значение операнда должно соответствовать следующему соотношению , в противном случе функция вернет ошибку.

определение

#

тип смещения

REF_OFF8

0

8-битное смещение

REF_OFF16

1

16-битное смещение

REF_OFF32

2

32-битное смещение

REF_LOW8

3

смещение представлено 8 младшими битами 16 битного непосредственного значенияt

REF_LOW16

4

смещение представлено 16 младшими битами 32 битного непосредственного значенияt

REF_HIGH8

5

смещение представлено 8 старшими битами 16 битного непосредственного значенияt

REF_HIGH16

6

смещение представлено 16 старшими битами 32 битного непосредственного значенияt

Таблица 14

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

seg000:0100 start:

seg000:0100 mov ax, 105h

seg000:0103 retn

seg000:0103 ; ────────────────────────────────────

seg000:0104 MyStruc db 0

seg000:0105 dw 6666h

seg000:0107 dw 9999h

seg000:0107 seg000 ends

seg000:0107

a) исходные данные – требуется представить непосредственное значение, загружаемое в регистр AX в виде смещения, отсчитываемого относительного начала струкуры MyStruc.

OpOffEx(SegByName("seg000")+0x100,1,REF_OFF16,

SegByName("seg000")+0x104,SegByName("seg000"),1);

b) вызов функции OpOffEx для представления непосредственного значения в виде смещения, отсчитываемого относительно начала структуры MyStruc.

Пояснение: линейный адрес структуры MyStruc равен SegByName(“seg000”)+0x104, следовательно, целевой адрес tagreg равен SegByName(“seg000”)+0x104;

базовый адрес сегмента, которому принадлежит структура, будучи выраженным в байтах равен SegNyName(“seg000”), следовательно, аргумент base равен SegByName(“seg000”);

смещение искомого элемента относительно начала структуры равно operand_valueoffset MyStruc, т.е. в непосредственных значениях – 0x105 – 0x104 = 1, следовательно, аргумент tdelta равен 1;

операнд представляет собой 16-разрядное непосредственное значение, поэтому, тип смещения - REF_OFF16.

seg000:0100 start:

seg000:0100 mov ax, offset MyStruc+1

seg000:0103 retn

seg000:0103 ; ──────────────────────────────────────────

seg000:0104 MyStruc db 0 ; DATA XREF: seg000:0100o

seg000:0105 dw 6666h

seg000:0107 dw 9999h

seg000:0107 seg000 ends

с) результат – непосредственное значение теперь представлено в виде смещения, отсчитываемого от начала структуры MyStruc

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

??? #Верстальщику – chabge table

аргумент

пояснения

ea

линейный адрес элемента, которому принадлежит операнд

n

=n

пояснения

==0

первый слева операнд

==1

второй слева, третий (если он есть) и все остальные операнды

==-1

все операнды

reftype

==reftype

#

тип смещения

==REF_OFF8

0

8-битное смещение

==REF_OFF16

1

16-битное смещение

==REF_OFF32

2

32-битное смещение

==REF_LOW8

3

смещение представлено 8 младшими битами 16 битного непосредственного значенияt

==REF_LOW16

4

смещение представлено 16 младшими битами 32 битного непосредственного значенияt

==REF_HIGH8

5

смещение представлено 8 старшими битами 16 битного непосредственного значенияt

==REF_HIGH16

6

смещение представлено 16 старшими битами 32 битного непосредственного значенияt

target

==target

пояснения

!=BADADDR

целевое смещение

==BADADDR

вычислять целевое смещение автоматически по следующей формуле

base

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

tdelta

относительное смещение, считаемое относительно целевого смещения; может быть как положительным, так и отрицательным

return

=return

пояснения

==1

успешное завершение операции

==0

ошибка

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

Интерактивный аналог: “~Edit\Operad types\User-defined offset”;<Ctrl-R>

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