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

Long GetNextStrucIdx(long index);

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

CODE:1001D3E0 push ebx

CODE:1001D3E1 mov ebx, eax

CODE:1001D3E3 inc ebx

CODE:1001D3E4 call @get_struc_qty$qqrv

CODE:1001D3E9 cmp ebx, eax

CODE:1001D3EB jb short loc_0_1001D3F2

CODE:1001D3ED or eax, 0FFFFFFFFh

CODE:1001D3F0 pop ebx

CODE:1001D3F1 retn

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

long GetNextStructIdx(long index)

{

if (GetStrucQty()<a) return -1;

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=0;a<GetStrucQty();a++)

Message(“0x%X 0x%X \n”,

a,GetStrucId(a)

);

0x0 0xFF0000F0

0x1 0xFF0000FE

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

Индекс структуры в списке (от нуля до GetStrucQty()-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

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

Операнд

Пояснения

index

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

Return

==return

Пояснения

!=BADADDR

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

==BADADDR

Ошибка

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