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

Объявление переменных, типы переменных, преобразования переменных

Для объявления переменных используется ключевое слово auto за которым последовательно перечисляются декларируемые переменные, отделенные друг от друга запятой. Инициализация при объявлении не поддерживается.

Например:

auto x; auto x,y,z;

a) верно

auto x=1;

b) неверно

Все переменные, объявленные таким образом, локальные; поддержка глобальных переменных, доступных всем функциям отсутствует. Вместо этого IDA поддерживает виртуальные массивы, доступные всем функциям всех загруженных скриптов одновременно (см. главу ??? «Виртуальные массивы»).

Имя переменной не должно совпадать ни с одним зарезервированным ключевым словом. Зарезервированные ключевые слова в IDA те же самые, что и в Си.

IDA поддерживает два типа переменных – переменные типа строка и переменные типа число.

Строковые переменные ограничены максимальной длиной в 255 символов и заканчиваются нулем. Над ними доступны три операции – присвоение, контекция (слияние) и сравнение.

Переменные типа число в свою очередь делятся на два подтипа: long – 32-разрядное знаковое целое и float – число с плавающей запятой до 25 разрядов. Над ними обоими доступны операции – присвоение, сравнение, сложение, вычитание, умножение, деление. Над целочисленными переменными доступны битовые операции - циклический сдвиг вправо и влево, битовое И, битовое НЕ, битовое ИЛИ, битовое НЕТ и битовое ИЛИ-ИСКЛЮЧАЮЩЕЕ-И.

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

  • если левая переменная – строка, то и правая переменная преобразуется в строку;

  • если левая переменная – длинное целое, а правая – строка, правая переменная преобразуется в длинное целое;

  • если одна из переменных имеет тип float, все остальные переменные преобразуются в тип float;

  • если над переменной выполняются одна из битовых операций, она преобразуется в длинное целое

Преобразование «строка  длинное целое» осуществляется по следующей схеме: если левая часть строки представляет собой число, записанное в десятичной нотации, результат преобразования равен этому числу, в противном случае – нулю.

Примеры:

auto s0,s1,s2,s3;

s0=”1234”; s1=”1234mystring”,”0x1234”,”MyString”;

Message(“>%d,%d,%d,%d\n”,s0,s1,s2,s3);

>1234,1234,0,0

Преобразование «длинное целое  строка» осуществляется путем дописывания завершающего нуля к преобразуемому значению.

Примеры:

auto a,b;

a=0x21;b=0x22232425;

Message(“>%s,%s\n”,a,b);

> !,%$#"

Преобразование «строка  float» осуществляется аналогично преобразованию «строка  длинное целое», включая дробную часть; если же преобразование невозможно, результат равен нулю.

Например:

auto s0,s1;

s0=”1.1”; s1=”MyString”;

Message(“>%f,%f\n”,s0,s1);

> 1.1, 0.

Преобразование «float  строка» в отличие от преобразования «длинное целое  строка» осуществляет действительно корректное преобразование, сравните:

auto f; auto a;

f=”1.2”; a=0x21;

Message(“>%s\n”,f); Message(“>%s\n”,a);

> 1.2 >!

При сложении двух строковых переменных происходит их контакция (слияние); при вычитании одной строки из другой левый операнд игнорируется, а над каждым символом правого выполняется операция NEG (дополнение до нуля); при делении и умножении сток друг на друга они преобразуются к длинному целому. Операции вычитания, деления и умножения строк недокументированны и по-разному могут вести себя в зависимости от версии IDA. Рекомендуется воздержаться от использования их в собственных программах.

Смешивание операндов различных типов заставляет внимательно относиться к порядку расстановки их выражении – результат может зависеть от перемены мест слагаемых, например:

auto x,s0;x=1;s0=”3h”; auto x,s0;x=1;s0=”3h”;

Message(“>%x\n”,x+s0); Message(“>%x\n”,s0+x);

>4 >3

Пояснение: в первом случае левая переменная – длинное целое, поэтому, строка “3h” преобразуется к длинному целому, в результате чего получается: 1+3=4; во втором случае левая переменная – строка, поэтому, длинное целое #1 преобразуется к строке, в результате чего получается: “3h”+’\x1’ = “3h\x1”, но затем “3h\x1” вновь преобразуется к длинному целому, ибо того требует спецификатор “%x”, а “3h\x1” = #3. Так что от перемены мест слагаемых сумма меняется!

Смещение типов – частый источник трудноуловимых ошибок, и лучше использовать явное преобразование вызовом следующих функций:

  • long ( переменная ) // Преобразует переменную в длинное целое

  • char ( переменная ) // Преобразует переменную в строку

  • float( переменная ) // Преобразует переменную в тип float

Например:

auto x,s0;x=1;s0=”3h”; auto x,s0;x=1;s0=”3h”;

Message(">%d\n",long(s0)+x); Message(">%d\n",x+long(s0));

>4 >4

На этот раз от перемены мест слагаемых сумма не изменяется!

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