Анимация
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

0002 struc 2 0002

0000 ; 0000

0000 struc 3

0000 field 0

0001 struc 3

ends

struc db ? ends

Message("0x%X \n",

GetLastStrucIdx(

==return

Пояснения

Return

!=BADADDR

Индекс последней структуры в списке

==BADADDR

Нет ни одной структуры

long GetNextStrucIdx(long index);

Функция возвращает следующий индекс в списке структур. Индекс выражается целым числом от нуля до GetStrucQty() - 1. Индексы следуют последовательно вплотную друг за другом без «пустот» Поэтому псевдокод этой функции очень прост.

CODE:1001D3E0

push

CODE:1001D3E1

ebx, eax

CODE:1001D3E3

CODE:1001D3E4

call

@get struc qty$qqrv

CODE:1001D3E9

ebx, eax

CODE:1001D3EB

short loc 0 1001D3F2

CODE:1001D3ED

eax, 0FFFFFFFFh

CODE:1001D3F0

CODE:1001D3F1

retn

Или то же на языке Си:

long GetNextStructIdx(long index)

if (GetStrucQty()<a) return ++index; }

return -1;

По этой причине два следующих скрипта абсолютно идентичны:

0000 struc 1

0000 field 0

0001 field 1

0002 field 2

0003 struc 1 0003

0000 ; 0000

0000 struc 2

struc

db ? db ? db ?

ends

struc



0000 field 0

0002 struc 2 0002

0000 ; 0000

0000 struc 3

0000 field 0

0004 struc 3 0004

dw ?

ends

struc

dd ?

ends

auto a;

for(a=0;a<GetStrucQty();a++)

Message("0x%X 0x%X \n",

a,GetStrucId(a)

OxO OxFFOOOOFO 0x1 OxFFOOOOFE 0x2 0xFF000100

auto a;

a=0;

while(1) {

Message("0x%X 0x%X \n",

a,GetStrucId(a)

a=GetNextStrucIdx(a); if (a==-1) break;

0x0 0xFF0000F0 0x1 0xFF0000FE 0x2 0xFF000100

Какой из этих двух способов использовать дело вкуса каждого. Однако, читабельность первого примера значительно лучше, а вероятность допустить ошибку -меньше.

Операнд

Пояснения

index

Индекс структуры в списке (от нуля до GetStrucQtyO-1)

Return

==return

Пояснения

!=BADADDR

Индекс следующей структуры в списке

==BADADDR

Ошибка

long GetPrevStrucIdx(long index);

Функция возвращает предыдущий индекс в списке структур. Индекс выражается целым числом от нуля до GetStrucQty() - 1. Индексы следуют последовательно вплотную друг за другом без «пустот» Поэтому псевдокод этой функции очень прост.

long GetPrevStrucIdx(long index)



if (index<-1) return; return -index;

По этой причине два следующих скрипта абсолютно идентичны:

0000 struc 1 struc

0000 field 0 db ?

0001 field 1 db ?

0002 field 2 db ?

0003 struc 1 ends 0003

0000 ; -------------------0000

0000 struc 2 struc

0000 field 0 dw ?

0002 struc 2 ends 0002

0000 ; -------------------0000

0000 struc 3 struc

0000 field 0 dd ?

0004 struc 3 ends 0004

auto a;

for(a=GetStrucQty();a>0;--a) Message("0x%X 0x%X \n",

a,GetStrucId(a)

0x2 0xFF000100 0x1 0xFF0000FE 0x0 0xFF0000F0

auto a;

a=GetStrucQty()-1;

while(1)

Message("0x%X 0x%X \n",

a,GetStrucId(a)

a=GetPrevStrucIdx(a); if (a==-1) break;

0x2 0xFF000100

0x1 0xFF0000FE

0x0 0xFF0000F0

Какой из этих двух способов использовать дело вкуса каждого. Однако, читабельность первого примера значительно лучше, а вероятность допустить ошибку -меньше.

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



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