Анимация
JavaScript


Главная  Библионтека 

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

Message("0x%X \n", RfirstB(0x1014F)

0x1014A

Как получить действительно первый элемент источника списка можно прочитать в описании функции RnextB

Операнд

Пояснения

Линейный адрес приемника списка перекрестных ссылок

Return

Пояснения

Источник ссылки на следующую инструкцию или если ее нет, то первый адрес в списке.

-1 если список исчерпан или отсутствует источник

long RnextB (long To,long current);

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

Для более глубокого понимания принципов работы рекомендуется ознакомиться с описанием функций AddCodeXref, DelCodeXref, Rnext, RfirstB.

Очевидно, что по одному и тому же линейному адресу может существовать более одного приемника перекрестных ссылок.

Например:

seg000:

013B

loc 0 14F

источник

seg000:

013D

ds, ax

seg000:

013F

ax, cs

seg000:

0141

es, ax

seg000:

0143

lodsb

seg000:

0144

al, 21h ;

seg000:

0146

loc 0 14F

источник

seg000:

0148

al, 7Ah ;

seg000:

014A

loc 0 14F

источник

seg000:

014C

stosb

seg000:

014D

loop

loc 0 143

источник

seg000:

014F

seg000:

014F loc 0 14F:

CODE XREF:

seg000:

013Bj

seg000:

014F

seg000:

0146j ...

seg000:

014F

приемник

seg000:

014F

Реализация этой функции повторяет особенность реализации Rnext. Не смотря на то, что в idc.idc утверждается будто бы эта функция «видит» тип перекрестных ссылок, указывающих на следующую команду, в действительности этого не происходит. И выделенный красным цветом адрес источника функция не вернет никогда. {0x1013B,

0x10146, 0x1014A, 0x1014C}.



Поскольку RnextB хранит текущий адрес не во внутренней переменной, а в передаваемом параметре, то существует возможность, модифицируя его, управлять работой функции.

Так, например, RnextB(ScreenEA(), 0) гарантированно вернет следующий за ним адрес, то есть 0x1013B, а пройти весь список (за исключением ссылок на следующую инструкцию) можно с помощью следующего кода:

auto a;

a=0;

for (;;)

a=RnextB(ScreenEA(),a); if (a==-1) break; Message("0x%X \n",a); }

0x1013B 0x10146 0x1014C

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

auto a; a=0;

for (;;)

a=RnextB(ScreenEA(),a);

if (a==-1) break;

if (a>RfirstB(ScreenEA())

Message("0x%X \n",

RfirstB(ScreenEA()

Message("0x%X \n",a);

0x1013B 0x10146 0x1014A 0x1014C

Функция возвращает ошибку BADADDR, если список исчерпан, (то есть текущий адрес наибольший в списке) или не существует.

Операнд

Пояснения

Линейный адрес приемника списка перекрестных ссылок

Current

Текущий адрес

Return

Пояснения

Следующий адрес в списке

-1 если список исчерпан или отсутствует источник



long RfirstO (long From);

Функция возвращает линейный адрес приемника перекрестной ссылки для заданного источника.

Практически идентична Rfirst, за тем исключением, что не имеет доступа к ссылкам на следующую инструкцию, поэтому возвращает действительно первый элемент списка линейный адресов приемников.

Поэтому ее рекомендуется использовать в паре с функцией Rnext, впрочем, Rnext(xxx, 0) возвращает идентичный результат и хотя работает ничуть не быстрее, но немного экономит на компактности кода.

Для понимания этого рекомендуется ознакомиться с описанием функций AddCodeXref, DelCodeXref, Rfrst, Rnext

Если указан неверный источник, (то есть линейный адрес, не содержащий перекрестных ссылок) или источник перекрестной ссылки данных, то функция возвратит ошибку BADADDR

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

seg000:28C6 seg000:28C7

pop pop

источник приемник

Message("0x%X \n Rfirst0(0x128C6)

0xFFFFFFFF

seg000:28CB seg000:28CB

sub 0 2847

retn endp

Message("0x%X \n Rfirst0(0x128CB)

0xFFFFFFFF

seg000:2870

источник

seg000:2870 nop

loc 0 2 8 92 ;

seg000:2892 loc 0 2892 XREF: seg000:2870j seg000:2892

приемник

seg000:2892

; CODE ;

byte ptr [si], 22h ;

Message("0x%X \n", Rfirst0(0x12870)

0x12892

Операнд Пояснения

From

Линейный адрес источника перекрестной ссылки



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