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

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

Замечание: для изменения размеров массива (усечения или расширения) достаточно передать функции адрес его начала и новую длину.

??? #Верстальщику - change table

аргумент

пояснения

линейный адрес первого элемента массива или линейный адрес головы уже существующего массива

nitems

размер массива, выраженный в количестве элементов

return

=return

пояснения

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

ошибка

Родственные функции: нет Интерактивный аналог: "~Edit\Array"; <*>

success MakeAlign(long ea,long count,long align)

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

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

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

Аргумент count задает количество байт, использующихся для выравнивания. Значение count должно быть больше нуля и меньше кратности выравнивания, т.е. 2align > count > 0, в противном случае функция возвратит ошибку.

Аргумент align задает кратность выравнивания и представляет собой показатель степени с основанием два. Т.е. если align равен четырем, то кратность выравнивания -шестнадцати, т.к. 24=16. Если align равен нулю, функция определяет необходимую степень выравнивания автоматичен, используя наибольшее возможное значение.

Для изменения величины выравнивания достаточно передать функции MakeAlign линейный адрес уже существующей директивы Align и новые значения count и align.

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

seg000:0000

48h ;

seg000:0001

65h ;

seg000:0002

6Ch ;

seg000:0003

6Ch ;

seg000:0004

6Fh ;

a) исходные данные

MakeAlign(SegByName("seg0 0 0")+1,3,2);



b) вызываем функцию MakeAlign для помещения по адресу seg000:0001 директивы align 4. Для выравнивания используются три байта - seg0001, seg0002 и seg0003.

seg000:0000 db 48h ; H

seg000:0001 align 4

seg000:0004 db 6Fh ; o

c) результат - успешное создание директивы выравнивания

??? #верстальщику - change table

аргумент

пояснения

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

count

число байт, использующихся для выравнивания

align

=align

пояснения

==[1..5]

показатель степени выравнивания с основанием два

автоматическое определение кратности выравнивания

return

=return

пояснения

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

ошибка

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

Интерактивный аналог: "~Edit\Structs\Other\ Create alignment directive";<L>

long MakeCode (long ea)

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

a) текущая инструкция не изменяет нормального выполнения программы и за ее концом расположены бестиповые байты;

b) текущая инструкция изменяет нормальное выполнение программы, осуществляя переход по непосредственному адресу, тогда IDA продолжит дизассемблирование с этого адреса

Если встречается инструкция, изменяющая адрес перехода непредсказуемым образом (например, RET) IDA прекращает дизассемблирование.

Во время дизассемблирования IDA при необходимости создает перекрестные ссылки и автогенерируемые метки. Подробнее об этом можно прочитать в главах «Перекресые ссылки» и «Глобальные настойки» соотвественно.

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

Благодаря этому дизассемблируется все вызываемые функции, условные переходы и все косвенные ссылки, которые IDA в состоянии распознать (например, если это не запрещено настойками, она может автоматически преобразовывать 32-разрядные непосредственные операнды по модулю больше 0x10000 в смещения на код - см. главу «Глобальные настойки»).

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



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

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

seg000:0100 start

83h ;

seg000:0101

0C6h ;

seg000:0102

seg000:0103

0FEh

seg000:0104

0E6h ;

seg000:0105

0B9h ;

seg000:0106

0BEh ;

seg000:0107

14h ;

seg000:0108

seg000:0109

0ADh ;

seg000:010A

91h ;

seg000:010B

56h ;

seg000:010C

80h ;

seg000:010D

34h ;

seg000:010E

66h ;

seg000:010F

46h ;

seg000:0110

0E2h ;

seg000:0111

0FAh

seg000:0112

0FFh

seg000:0113

0E6h ;

seg000:0114

18h ;

seg000:0115

a) исходные данные

Message(">%X\n",MakeCode(SegByName("seg000")+0x100));

b) вызываем функцию MakeCode для дизассемблирования кода

seg000:0100 seg000:0103 seg000:0103 ; seg000:0105 seg000:0106 seg000:0107 seg000:0108 seg000:0109 seg000:010A seg000:010B seg000:010C seg000:010D seg000:010E seg000:010F seg000:0110 seg000:0111 seg000:0112 seg000:0113 seg000:0114 seg000:0115 >3

с) результат

0B9h

0BEh

0ADh

0E2h

0FAh

0FFh

0E6h

функция дизассемблировала две инструкции и остановилась,



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